Einschränkungen bei threads?
-
Hallo,
kann man aus threads heraus Code ausführen, der zu
graphischen Ausgaben führt?Problem:
Aus meinem C++-Code starte ich matlab-Code ... geht super!
Wenn ich aber den matlab-Code aus einem thread heraus starte,
passiert nichts (Bsp. siehe unten).Code-Gerüst:
----------------------------------------------
#include <pthread.h>
#inlcude <engine.h>void *call_matlab(void *foobar)
{
...
engEvalString(ep, "figure;");
...
}
...
pthread_t ThreadA;
phtread_create(&ThreadA,NULL,call_matlab,NULL);
...
-----------------------------------------------Ich schreibe auch gerne mehr zu dem Problem, wenn sich
da jemand auskennt und etwas dazu sagen kann.Oder gibt es einen einfacheren Weg ausser über threads, damit
der Prozessablauf (vom C-Code) nicht auf das Ergebnis der
Matlab-Funktion wartet?Vielen Dank schonmal, sw.
-
jeder thread hat einen eigenen registersatz, einen eigenen stack usw. nur den speicher teilen sie sich. wenn du z.b. die matlab-lib aus einen thread initialisierst und aus einem anderen thread deren funktionen aufrufst, klappt das nimmer nicht.
denkbar wäre z.b. den matlab-kram komplett in einem thread zu haben und andere threads schicken ihm dann kommandos die er z.b. asynchron abarbeitet.
-
Danke für die schnelle Antwort.
Dann schreibe ich auch mal kurz mehr dazu.Ich initialisiere die Matlab-Engine und die Matlab-Variablen
in einer extra Funktion, hier also noch kein Thread, sondern
im ganz normalen C++ - Code. Dann kommt es irgendwann im C++ - Code
zu einem Aufruf einer Matlab-Funktion, sagen wir mal ganz einfach
eine figure erzeugen, fertig.
Wenn ich diesen Aufruf aber in ein thread-Funktion schreibe:void *call_matlab(void *foobar) { engEvalString(ep, "figure"); }
Dann passiert nichts.
Ohne den thread-Aufruf: pthread_create(&ThreadA,NULL,call_matlab,NULL);
funktioniert es, also so direkt im C++ - Code: engEvalString(ep, "figure");Kurzum: Matlab wird im normalen Code initialisiert, nur der Aufruf
zur Erzeugung einer figure ist in einem thread eingebettetFalls ich noch was nicht geschnallt habe schreib bitte. Ich komm
da einfach nicht weiter und denke.(Bin jetzt für ein paar Stunden weg, schaue aber heute Abend wieder rein.)
Danke für Antworten.
-
... eigentlich steht in dem "Matlab-Thread" noch viel mehr drin, aber
nicht mal der Aufruf einer figure funktioniert halt.
-
sw_77 schrieb:
Dann passiert nichts.
normalerweise sollte es abstürzen oder sonst sich komisch verhalten. dass _nichts_ passiert ist eher ungewöhnlich. ich würde mal prüfen, ob der thread überhaupt ausgeführt wird. du kannst ja z.b. hinter und vor dem aufruf der matlab-funktion ausgaben machen (printf, messagebox oder sowas). wenn man was sieht, wird zumindestens der thread gestartet.
-
Habe ich schon probiert. Der Thread wird ausgeführt.
Hatte es auch so gemacht, davor und dahinter zum Bsp.
einfach: cout << "hier war ich" << endl;Jeder C-Code funktioniert, halt nur die Matlab-Aufrufe interessieren
ihn scheinbar überhaupt nicht. Obwohl:
Beim Kompilieren kommt sowieso kein Fehler, aber ...
Die meisten Matlab-Funktionen verursachen keinen Fehler beim Ausführen.
Wenn ich aber eine Variable aus Matlab holen möchte
result = mxGet ... blabla
c_variable = *(mxGetPtr(result));
Dann kommt ein Segmentation fault nach dem das Programm kurz lief.Scheinbar macht er also was, aber zeigt überhaupt nichts an.
-
Dieser Thread wurde von Moderator/in Gerard aus dem Forum C++ in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.