Multithreading: Msgs zwischen Threads
-
DStefan schrieb:
"Stürzt wahllos ab" ist nicht wirklich eine erschöpfende Beschreibung. Kriegst du Meldungen? Falls ja, welche?
Und lebt das an den Thread übergebene Objekt wirklich lange genug? Immerhin legst du es in einer Funktion als lokales Objekt an! Mach mal eine globale Variable daraus - nur zum Testen - oder verwende new(). Wenns dann keine Abstürze mehr gibt (oder andere
) bist du vielleicht einen Schritt weiter.Stefan.
"Stürzt wahllos ab" is leider das einzige was ich dazu sagen kann, weil sich mein IDE (omnet++) aufhängt und die meldung bekomme "Project.exe reagiert nicht mehr".
Auch im debug modus kann ich nicht mehr herausfinden.Wenn ich das projekt zum 1. mal starte läuft es durch. wenn ich es dann stoppe und gleich wieder starte hängt es sich auf.
-
Ich habe den Thread und das Event jetzt global gemacht, aber es ist immer noch wie zuvor:
Ich starte das programm das 1. mal und es läuft. Starte ich es danach gleich nochmal, hängt es sich einfach auf ohne eine Fehlermeldung oder sonstiges auszugeben.
Auch im debugger kann ich nicht eingrenzen wo genau der Fehler auftritt
-
Dann hilft dir vielleicht ein Trace weiter: Erstelle dir einen globalen std::ofstream auf eine Datei deiner Wahl. Schreibe an kritischen Stellen Trace-Einträge in den Stream. Wenn das Programm abgestürzt ist, solltest du zumindest herausfinden können, was es zuvor gemacht hat. Etwa so:
#include <fstream> std::ofstream trace("c:\\dev\\myprogram\\trace.txt"); void func() { trace << GetCurrentThreadId() << ": func() 0" << std::endl; bar(); trace << GetCurrentThreadId() << ": func() 1" << std::endl; DWORD rc = WaitForSingleObject(); trace << GetCurrentThreadId() << ": func() 2" << std::endl; // ... usw. trace << GetCurrentThreadId() << ": func() exit" << std::endl; }Indem du mit GetCurrentThreadId() immer die Thread-Id davor schreibst, weißt du, welcher Thread was gemacht hat.
Das Problem mit dem Trace ist natürlich, dass er möglicherweise das Programm so verlangsamt, dass die Fehler nicht mehr auftreten. Einen Versuch ist es aber vielleicht wert.
Stefan.
-
Danke für die Antwort!
bevor ich das mache, hab ich mal einfach einige zeilen auskommentiert und bin dadurch jetz darauf gekommen, dass das Thread erstellen manachmal einfach nicht funktioniert

Also das Thread erstellen läuft ja bereits in ner Threadfunktion eines anderen Threads.
Dieser erste Thread wird noch ohne probleme erstellt, und nur wenn ich
HANDLE secondThread; secondThread = (HANDLE) CreateThread(NULL,0, cB.threadFunction, (void*) &to, 0, NULL);auskommentiere läuft er auch durch. Lass ich dieses CreateThread stehen, kommt es zu dem Fehler (wie gesagt, nicht immer..) Auch wenn ich in der threadFunction dieses secondThreads gar nichts mache, den Thread also nur erstelle, kommt es zu dem Fehler. Das selbe, wenn ich als Parameter nicht das struct sondern gar nichts übergebe.
Ich brauche aber den zweiten Thread in dem ersten Thread, sonst kann ich nicht umsetzen, was ich geplant habe.
Vielen Dank für die Hilfe,
Severin