Registriert seit: 8. Mär 2008
4 Beiträge
|
Re: Synchronisieren von hauptthread und Teilthread
10. Mär 2008, 18:14
Danke für die bisherigen Hinweise !
Mein Hauptproblem bestand offensichtlich in der Annahme, dass auch im Hauptthread mehrere scheinbar parallelen Prozesse wie
o Timer-Routinen in verschiedenen gleichzeitig sichtbaren Fenstern
o dazwischen auch mal ein BtnClick usw., jeweils mit gewisser Bearbeitungszeit
mit CS.enter/cs.Leave voreinander geschützt werden können.
Das geht - nun ist mir das klar - nicht, weil immer derselbe Thread = Hauptthread sperren soll, dabei aber nur irgendeinen Zähler im CS-Objekt verändert. Alles andere wäre ja auch komplette unsinnig, da sofort ein Deadlock entstehen würde.
Das im Moment noch Rätselhafte für mich ist allerdings, dass durch den Aufruf von cs.enter im Haupthtread bei gleichzeitig laufenden Nebenthreads mit CriticalSections das Programm komplett blockiert wird, also nicht nur die mit cs.enter geschützten Nebenthreads blockieren. Zu einem cs.leave komme ich dann gar nicht mehr.
Noch merkwürdiger: das scheint erst seit kurzem aufzutreten. Ich werde aber nochmals testen, ob das im Zusammenhang mit dem Aufruf von Mainthread-Methoden z.B. einer Form auftritt. Es könnte sein, dass dann gerade die Zeile
Synchronize(form1.DoEtwas)
diesen Effekt bewirkt.
Ich habe mittlerweile den Rat u.a. von Dani beherzigt:
Kritischen Abschnitte des Hauptthreads werden in einen Event gelegt, der vom Nebenthread ausgelöst wurde.
Innerhalb des Events wird dann die Aufgabe ohne Aufruf von KeepWindowsAlive erledigt, so dass parallel dazu weder ein anderer Thread noch der Hauptthread reinspucken kann.
Das scheint zu klappen.
Danke noch mal an alle !
|