![]() |
AW: Thread beenden durch Button clicked
Grundsätzlich kann man das Grid aus dem Thread heraus befüllen, wenn dies synchronisiert erfolgt. So lange steht halt der Thread.
Wenn man ein Zwischenergebnis schnell in eine Liste wirft, kann der Thread sofort weiter wuseln und das nächste Ergebnis holen. Der Mainthread kann dann nach und nach ein Ergebnis aus der Liste holen und dieses darstellen. In dem Fall muss aber die Liste gegen konkurrierende Zugriffe abgesichert werden (z.B. mit CriticalSections) damit der Thread die Liste nicht beschreiben will während der Mainthread einen Eintrag entnimmt und die Liste kürzt. Der Thread könnte dann keinen Eintrag mehr hinter die ermittelte letzte Position hängen, da die inzwischen nicht mehr existiert. Also ist die ursprüngliche Lösung die einfachere und bessere, sofern diese keine Performanceprobleme mit sich bringt. |
AW: Thread beenden durch Button clicked
Ist eigentlich niemand aufgefallen, dass man mit
Delphi-Quellcode:
auf das VCL-Formular aus dem Thread zugreift, was man tunlichst unterlassen sollte?
Form1.Measure;
|
AW: Thread beenden durch Button clicked
Hallo Leute,
vielen Dank für das tolle Feedback. Ich hatte das mit MyThreadObject.terminate schon ausprobiert. Dabei kommt mir aber eine Fehlermeldung auf 'Cannot terminate an externally thread.' Bei MyThreadObject.free wird mir eine Access Violation angezeigt. Ich habe mir eine 'WAIT'-Funktion in meine WriteToStringgrid - Procedure geschrieben, das sollte doch reichen? Wäre schön wenn wir das noch lösen könnten ;) |
AW: Thread beenden durch Button clicked
Moin,
setze im Thread "FreeOnTerminate" auf "True" und schreibe in Deinem Main-Thread (Fenster) eine Ereignisbehandlung für "OnTerminate", in der Du z.B. eine Message ausgibst ("Thread beendet"), ein Flag setzt oder andere schöne Dinge tust, um die Beendigung des Threads mitzubekommen. Der Thread wird mit "Terminate" zum Beenden angeregt. Die von Dir angesprochene Fehlermeldung ("extern ...") kenne ich z.B. von dem Fall, dass der Thread eigentlich schon freigegeben ist (z.B. weil das Programm beendet wird). Hope this helps, Geert |
AW: Thread beenden durch Button clicked
Zitat:
Da stellt sich mir die Frage: OnTerminate wird doch ausgelöst, sobald die Methode Execute des Threads zurückgekehrt ist, aber bevor der Thread freigegeben wird. Aber ich möchte ja mit der Flag des Terminates meine Schleife beenden lassen. Wenn ich das richtig verstanden habe, werde ich aber solange zurückkehren, wie mein Terminate nicht gesetzt ist. Da bin ich mir also nicht so schlüssig, wie ich damit arbeiten soll. Danke schonmals. Markus |
AW: Thread beenden durch Button clicked
Die drei TerminateXXX:
Terminate: Methode, um den Thread zu beenden. Kann aus anderen Threads aufgerufen werden, um einen Thread dazu zu bringen, die Ausführung zu beenden. Terminated: Eigenschaft, kann in der Execute-Methode abgefragt werden, um auf eine Terminate-Anforderung zu reagieren. OnTerminate: Event, wird aufgerufen, wenn der Thread beendet wird. ...:cat:... |
AW: Thread beenden durch Button clicked
Da du dich mit Threads auskennst.
.Free, .Terminate oder beides um einen Thread zu beenden? |
AW: Thread beenden durch Button clicked
Zitat:
Delphi-Quellcode:
, das mache ich meist direkt im Konstruktor, so dass es per Standard für alle Threads gilt. Dann reicht ein Aufruf an
FreeOnTerminate := True;
Delphi-Quellcode:
, um den Thread zu beenden, auch wird dieser dann automatische freigegeben, wenn das Programm beendet wird oder dieser seine Aufgabe erfolgreich erledigt hat. Das hilft Speicherlöcher zu vermeiden.
Terminate;
...:cat:... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz