Forum: Object-Pascal / Delphi-Language
Delphi
by Tryer,
23. Aug 2011
Da ausschliessliuch der Thread selber SuspendCount verringert seh ich darin kein Problem - auch wieder ein Fall wo nur das Suspend aus einem anderen Thread zum Fehler führt.
Forum: Object-Pascal / Delphi-Language
Delphi
by Tryer,
23. Aug 2011
SuspendThread
Genau das mache ich in dem Beispiel. Suspend könnte man dabei an Stelle von SuspenThread genauso gut verwenden und die Warnung ignorieren - da es so halt "richtig" angewendet wird und Deadlocks ausgeschlossen sind.
Die optionale Verwendung von Events oder Sleep hatte ich ja bereits genannt, siehe auch Suspending Thread Execution
Wie auch in der Delphi-Hilfe werden in jedem...
Forum: Object-Pascal / Delphi-Language
Delphi
by Tryer,
22. Aug 2011
Das Suspend würde ich nicht durch Terminate ersetzen, das funzt halt einfach nicht.
Das "gefähliche" Suspend von aussen würde ich halt vermeiden indem ich nur ein Flag setze über welches der Thread sich zu einem sicheren Zeitpunkt (wenn er gerade nichts blockiert) selber unterbricht. Das Fortsetzen (ResumeThread) ist dann unkritisch.
Grüsse, Dirk
Forum: Object-Pascal / Delphi-Language
Delphi
by Tryer,
22. Aug 2011
Hmm.. wenn property Terminated wie in älteren Versionen ReadOnly ist und .Start das scheinbar auch nicht zurücksetzt ist es natürlich keine Lösung - dann kann man den Thread auch freigeben und einen neuen erzeugen.. das Konzept scheint mal wieder sehr gut durchdacht zu sein :?
Idee:type
TMyThread = class(TThread)
private
FHalted: Boolean;
procedure SuspendIfHalted;
public
...
Forum: Object-Pascal / Delphi-Language
Delphi
by Tryer,
22. Aug 2011
Suspend sollte man ganz vermeiden, da man nie wissen kann in welchem Augenblick man den Thread damit erwischt - schwer zu findende Deadlocks sind so vorprogrammiert. Besser Terminate oder ein eigenes Flag(Boolean/Event/Semaphore..) verwenden um den Thread ggf. an einer kontrollierten Stelle warten zu lassen.