EventWaitHandle und ManualResetEvent waren die Stichworte die mir gefehlt haben, vielen Dank.
Beim Konzept der EventWaitHandle habe ich aber noch Verständnisprobleme. Meine Lösung sieht nun ca. so aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| public class Hauptprogramm { private Thread nebenAufgabe; private SyncEvents syncEvents = new SyncEvents();
public void Hauptprogramm() { ... nebenAufgabe = new Thread(new ThreadStart(ErledigeNebenAufgabe)); nebenAufgabe.Start();
arbeiteWeiter(); }
private void ErledigeNebenAufgabe() { while (Irgenwas) { while (syncEvents.PauseThreadSignal.WaitOne(0, true) Thread.Sleep(0);
ErledigeKritischenSchritt(); } }
private void StopButtonClick(object sender, EventArgs e) { if (nebenAufgabe.ThreadState == ThreadState.Running) syncEvents.PauseThreadSignal.Set(); }
private void ResumeButtonClick(object sender, EventArgs e) { if (nebenAufgabe.ThreadState == ThreadState.Running) syncEvents.PauseThreadSignal.Reset(); } }
public class SyncEvents { private EventWaitHandle pauseThreadSignal;
public SyncEvents() { pauseThreadSignal = new ManualResetEvent(false); }
public EventWaitHandle PauseThreadSignal { get { return pauseThreadSignal; } } } |
ErledigeNebenAufgabe() prüft nun also vor jedem kritischen Schritt ob signalisiert ist, dass pausiert werden soll. Ist dies der Fall wartet der Thread solange bis das Signal wieder aufgehoben wird. Danach wird der kritische Schritt komplett ausgeführt bevor die nächste Überprüfung durchgeführt wird.
Ich weiß allerdings nicht, ob ich das Konzept hinter den EventWaitHandle durchschaut habe. Mich verwirrt der Name "EventWaitHandle". Es handelt sich doch eigentlich nicht um eine Ereignis auf das gewartet wird, sondern doch um ein
Signal, dass gesetzt oder nicht gesetzt ist. Oder verstehe ich das falsch?
Man könnte das gleiche Ergebnis doch auch einfach dadurch erzielen, dass man keine EventWaitHandle sondern einfache Bool-Flags verwendet: Der Hauptthread setzt
bool pauseThread = true und der Nebenthread prüft pauseThread = true und wartet entsprechend.
Der Vorteil den ich bei EventWaitHandle sehe ist, dass das Setzen und Lesen des Signals schon threadsicher ist und das Signal z.B. auch automatisch zurückgesetzt werden kann nachdem es gelesen wurde. Aber vom Prinzip ist es ein Flag (mit Zusatzfunktionen).
Sehe ich das richtig? Oder habe ich an dem Konzept etwas missverstanden?