AW: Exception ohne wirklichen Auslöser treibt mich in den Wahnsinn!
Zitat:
Zitat:
Wenn du wirklich in einem Thread direkt etwas an der VCL-Oberfläche ändern musst, dann ist dazu
Delphi-Quellcode:
bzw.
TThread.Synchronize(..)
Delphi-Quellcode:
da.
TThread.Queue(..)
Zitat:
Zitat:
Außerdem wiederhole ich gerne noch einmal mein "Du machst es dir unnötig kompliziert": Dein TThread-Objekt hat ganz komfortabel schon Eigenschaften wie
Delphi-Quellcode:
oder
Terminated
Delphi-Quellcode:
. Die kannst du einfach lesen und brauchst dir keine Sorgen machen. Und nichts eigenes erfinden.
Finished
|
AW: Exception ohne wirklichen Auslöser treibt mich in den Wahnsinn!
Günther: Bin mir nicht sicher, aber ich glaube in Delphi 2007 gibt es TThread.Finished nicht.
TThread.Terminate setzt ja nur die Boolean-Variable des Threads auf Terminated, ich kann ja (ohne das Finished von oben) nicht so einfach ohne eigene Variable feststelle, ob .Execute nun ordnungsgemäß beendet wurde? Klar, es gibt Event.WaitFor. Damit habe ich noch nie gearbeitet, und es scheint doch unverhältnismäßig komplizierter zu sein, als eine einfache Booleanvariable im Thread. Zumindest das Beispiel aus der OH ist nicht wirklich selbsterklärend:
Delphi-Quellcode:
Woher weiß z.B. das Event, dass es auf meinen Thread warten soll? Hier in dem Beispiel werden mehrere Threads erzeugt. Woher weiß das Event, dass alle fertig sind? Wird wrSignaled immer von Thread nach der Beendigung von Terminate gesetzt? Fragen über Fragen.
Event1.ResetEvent(); { Ereignis vor der Ausführung der Threads zurücksetzen }
for i := 1 to Counter do TaskThread.Create(False); { Aufgaben-Threads erzeugen und ausführen } if Event1.WaitFor(20000) <> wrSignaled then raise Exception; { nun den Haupt-Threads fortsetzen Alle Aufgaben-Threads sind beendet } Weiterhin Danke an Alle! :) |
AW: Exception ohne wirklichen Auslöser treibt mich in den Wahnsinn!
Falls es die
Delphi-Quellcode:
-Property noch nicht gibt, dann doch wenigstens das
Finished
Delphi-Quellcode:
-Ereignis? Das wird ausgeführt, wenn der Thread seine Execute-Methode verlassen hat. Als Bonus wird die Methode bereits im Kontext des Hauptthreads ausgeführt, du kannst also schon gefahrlos an VCL-Komponenten herumwerkeln.
onTerminate
Darin kannst du ja dann auch einfach eine
Delphi-Quellcode:
setzen.
meineForm.derThreadIstFertig := True
|
AW: Exception ohne wirklichen Auslöser treibt mich in den Wahnsinn!
Zitat:
Willst du im Hauptthread auf das Ende von MyThread warten, hilft MyThread.WaitFor (gegebenfalls mit einem Timeout). |
AW: Exception ohne wirklichen Auslöser treibt mich in den Wahnsinn!
Zitat:
Das steht weiter oben im Beispiel der OH:
Delphi-Quellcode:
Der Counter wird im OnTerminate eines jeden Threads heruntergezählt (mit critical section versteht sich!). Wenn 0 erreicht ist, weiß der Thread, dass er der letzte ist und macht das Lich aus (SetEvent).
procedure TDataModule.TaskTerminateThread(Sender: TObject);
begin ... CounterGuard.Acquire; { Zähler mit einer Sperre belegen } Dec(Counter); { Wert der globalen Zählervariable verringern } if Counter = 0 then Event1.SetEvent; { Signalisieren, ob es der letzte Thread ist } Counter.Release; {Sperre vom Zähler entfernen} ... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz