WaitForMultipleObjects mit UND/ODER Verknüpfung
-
Hallo,
ich möchte gerne folgendes realisieren:
Es gibt zwei Threads auf deren Beendigung gewartet werden soll. Es soll aber auch die Möglichkeit bestehen, dass Warten über einen Event Signalisierung vorzeitig abzubrechen. Es wäre schön, wenn in WaitForMultipleObjects so etwas möglich wäre wie:
Warte auf die Event Signalisierung ODER auf das Ende von Thread 1 UND 2.Wie könnte so etwas effizient implementiert werden?
Hintergrund:
Im Hauptfenster gibt es eine Schaltfläche Abbruch. Damit soll das Warten auf das Ende der Threads vorzeitig beendet werden. Die Threads durchlaufen eine große Schleife und können nicht bei jedem Durchlauf nachsehen, ob das Event Signalisiert ist. Der Anwender soll aber nach dem Abbruch schon weiter arbeiten können, er muss nicht auf das Ende der Threads warten.
-
Du kannst sowohl Thread- als auch Event-Handles in den Array unterbringen, würde ich sagen.
MS schrieb:
The array can contain handles of objects of different types.
Ach so, hab deine boolsche Verknüpfung ignoriert. Hm, also falls es keine elegantere Lösung gibt, kannst du dir doch eine Schleife mit zwei WaitFor[...]O
bject[s] basteln (eine für die Threads, eine für das Event). Die haben dann jeweils sehr kurze Timeouts, und du fragst halt deine Bedingung entsprechend ab. Ein richtiges Timeout müsstest du dann selbst per GetTickCount oder so einbauen.
-
Hi _matze,
ein ständiges Abfragen von zwei WaitForMultipleObjects(...) in einer Schleife wollte ich eigentlich vermeiden. Wäre schön, wenn Windows das Warten (wie bei WaitFor...) erledigen könnte.
-
Du könntest ja auch einfach dann von der Schaltfläche die beiden ThreadEvents setzen.
-
Kompliziertere Bedingungen lassen sich nicht so einfach abbilden, aber das hier beschriebene sollte doch relativ einfach gehen:
// pseudocode result = WaitForMultipleObjects(event ODER thread1); if (result == thread1) result = WaitForMultipleObjects(event ODER thread2); // hier ist entweder "event" ODER ("thread1" UND "thread2") signaledSchleife ist hier nur nötig/sinnvoll wenn es mehr als 2 Threads sind. Und selbst dann ist der Overhead nicht schlimm, da bei N Threads max. N Aufrufe von WaitForMultipleObjects nötig sind.
-
1. WaitForSingleObject auf das terminierungs Event mit 100ms
Wenn das fällt ist ja alles klar.
2. Dann nachsehen mit WaitForMultipleObjects ob Thread1 und Thread2 zu Ende sind. Wartezeit 0. Auf beide warten. Wenn beide signalsiert sind OK, sonst weiter bei 1.