Threads synchronisieren
-
so ähnlich mache ich es jetzt, wobei ich als "Signal" halt eine globale Variable verwende. Jetzt wäre die Frage, was ist das für ein "Signal", welches Du im Sinn hast? Hast'e ggf. ein paar Codezeilen zur Veranschaulichung?
-
Naja halt das CEvent,
ist so ähnlich wie ne globale Variable, ja, aber threadsafeTheoretisch kannst auf die einfache Art erstmal deine globalen Variablen vom Typ bool(oder was auch immer) durch CEvent ersetzen.
Mit SetEvent() wird dann auf signaled geschalten.
-
Hallo Pellaeon,
das CEvent scheine ich brauchen zu können. Leider bin ich nicht gerade der Großmeister was Objekte angeht...

muß ich jetzt eine <variable> anlegen und dann variable.CEvent(...) schreiben oder wie geht das jetzt?

-
öhm nein, CEvent ist die Klasse, davon brauchst du eine Instanz
also z.B. einfach
CEvent event;warten auf das Event tust du mit
::WaitForSingleObject(event.m_hObject,INFINITE);Wobei der zweite Parameter davon abhängt, was du genau willst(näheres siehe MSDN)
Das wäre das, was bei dir am ENde des ersten Teils von Thread 1 steht.Thread 2 aktiviert das Event dann mit
event.SetEvent();
-
ok: event.SetEvent() macht Thread 2 am Schluß, wenn er fertig ist!? Wird das Event denn auch wieder zurückgesetzt, wenn nachdem es abgefragt wurde? Es sollte halt beim nächsten Mal auch noch funktionieren...
-
Gibt es eigentlich auch die Möglichkeit, das Event nur abzufragen und nicht zu warten (und ohne ggf. das Event vorzeitig zu reseten)? Ich möchte damit gerne eine auch noch eine if-Abfrage durchführen...
-
autodidakt schrieb:
Gibt es eigentlich auch die Möglichkeit, das Event nur abzufragen und nicht zu warten (und ohne ggf. das Event vorzeitig zu reseten)? Ich möchte damit gerne eine auch noch eine if-Abfrage durchführen...
du kannst wählen zwischen 'manual-' und 'autoreset' events.
nur abfragen ohne zu warten geht mit 'WaitForSingleObject (..., 0)'

-
event.ResetEvent();Zum Thema "abfragen" hat ja vista schon geantwortet
-
Pellaeon schrieb:
Zum Thema "abfragen" hat ja vista schon geantwortet
Vista?

-
Wenn es ein auto-reset Event ist gibt es keine mir bekannte Möglichkeit den Zustand abzufragen ohne den Event zu resetten.
Wenn es ein manual-reset Event ist eben "WaitForSingleObject(h, 0)".
Im Allgemeinen sollten sich Anfänger auch eher an die lieben manual-reset Events halten, mit denen macht man in der Regel weniger Fehler.
Und auf keinen Fall PulseEvent verwenden, die Funktion ist pöse (steht eh in der MSDN, mit Begründung und allem).
-
Also das lässt sich doch noch vereinfachen

Pellaeon schrieb:
warten auf das Event tust du mit
::WaitForSingleObject(event.m_hObject,INFINITE);Erstens: CEvent kann implizit in ein Handle umgewandelt werden, also brauchst du das ".m_hObject" in dem Aufruf nicht.
Zweitens: Du kannst auch auf Threads warten - und wenn du nur wissen willst, ob der Thread beendet ist, reicht das völlig aus:
HANDLE thread2 = CreateThread(/*Thread 2*/); ... WaitForSingleObject(thread2,INFINITE);//Wartet auf das Ende von Thread 2
-
so langsam fang' ich an durchzublicken...

Vielen Dank für weiteren die Hinweise! Alles sehr nützlich!