![]() |
Thread beenden durch Button clicked
Hallo Leute,
ich sitze gerade an einer Synchronisation von zwei Threads ( Messung und Übertragen in einen Stringgrid) und möchte eine TThread.execute schreiben und dieses mit einem Button click meiner GUI wieder beenden. procedure TMeasThread.Execute; begin try repeat Form1.Measure; {Messung} Synchronize(WriteToStringgrid); {übertragen der Messwerte} until //Button1.clicked, ich weiß es muss mit Sender irgendwie abgeglichen werden, aber nicht genau wie except .... end; end; Ich bitte um hilfe. Ich bin noch ein rechter Anfänger (also wäre ein Erklärung "for dummies" am besten :) ) mit freundlichen Grüßen Markus |
AW: Thread beenden durch Button clicked
Bei deinem Button rufst du Thread.Terminate auf und im Thread überprüfst du, ob das Terminated-Flag gesetzt ist und brichst dann die Verarbeitung ab.
Delphi-Quellcode:
Dabei dürfen die einzelnen Schritte in der While-Schleife natürlich nicht ewig dauern, sonst hängt der auch bis er irgendwann wieder am Schleifenanfang ist.
procedure StopThread;
begin FThread.Terminate; FThread.WaitFor; end; procedure TMeasThread.Execute; begin while not Terminated do begin Form1.Measure; {Messung} Synchronize(WriteToStringgrid); {übertragen der Messwerte} // was machen end; end; |
AW: Thread beenden durch Button clicked
Ich nehme an
Delphi-Quellcode:
ist vom Typ
FThread
Delphi-Quellcode:
?
TMeasThread
(Entschuldige die dumme Frage, aber meine Erfahrung mit Threads ist minimal) Gruß K-H |
AW: Thread beenden durch Button clicked
Ich kenne mich nicht perfekt aus.
Aber ich würde MeinThread.Free; bevorzugen. Ich habe jetzt auch nicht die Source-Codes hier. Aber wird beim Aufruf von Free intern nicht irgendwo Terminated auf True gesetzt? Ich jedenfalls habe mit Free; immer bessere Erfahrungen gemacht als mit Terminated. Ok ein kleiner Test hat gezeigt: Free setzt Terminated auf True |
AW: Thread beenden durch Button clicked
Hallo Markus,
herzlich willkommen erst mal :-) Form1.Measure könnte man evtl. besser noch in dem Thread selbst unterbringen um die Messung auch noch vom Mainthread abzugrenzen. Andernfalls müsste man diese auch noch synchronisieren und dann wäre der Thread unnötig (jedenfalls nach dem vorliegenden Beispiel). |
AW: Thread beenden durch Button clicked
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin DeinThreadObject := TDeinThreadObject.Create; // Thread erzeugen (wie auch immer du das machst, falls anders) end;
Delphi-Quellcode:
procedure TMeasThread.Execute;
begin while not Terminated do // solange der Thread nicht erminiert wurde, führe die Schleife aus begin Form1.Measure; {Messung} Synchronize(WriteToStringgrid); {übertragen der Messwerte}; end; end;
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin DeinThreadObject.Free; // Thread "terminieren" end; |
AW: Thread beenden durch Button clicked
Zitat:
Delphi-Quellcode:
rein damit der Thread die CPU nicht zu 100% auslastet.
Sleep(1)
Und wie Stahli schon schreibt, solltest du aus dem Thread nicht auf deine Form(klasse) zugreifen. Methoden funktionieren zwar, aber jenachdem was darin mit der GUI passiert, könnte es unschöne Effekte geben. Von daher lager die am Besten auch in den Thread aus. Nur deshalb machst du diesen ja. |
AW: Thread beenden durch Button clicked
Verständnisfrage: wie soll man dann von innerhalb des Threads das StringGrid füllen?
Mit einer ProgressBar würde ich es vielleicht so machen... - innerhalb des Threads wird eine Variable gesetzt welche auf dem Hauptformular in einem Timer abgefragt wird und die ProgressBar setzt. Oder so ganz und gar nicht? Aktuell benutze ich statt des Timers einen zweiten Thread der nur dafür da ist die ProgressBar zu bedienen, insofern sich ein bestimmter Wert geändert hat. Aber mit einem StringGrid ist das ja nicht so leicht machbar. |
AW: Thread beenden durch Button clicked
Zitat:
Bei einer Progessbar setzt du die Position auf einen Wert oder rufst Step() auf. Bei einem StringGrid müsstest du nur
Delphi-Quellcode:
ausführen. Ist ja im Prinzip das Gleiche.
StringGrid.Cells[0, 0] := 'String';
Nur macht man es nicht. Ich würde aus dem Thread ein Event mit Synchronize feuern, das von der MainForm abonniert wurde, und dann das StringGrid updaten. |
AW: Thread beenden durch Button clicked
Zitat:
Du kannst z.B. in der Messung einen Ergebnissatz erstellen. Die Messung sendet an den Haupt-Thread eine Nachricht, und dieser holt dann den Ergebnissatz ab und trägt ihn in das Grid ein. Und wenn es mehr als 1 Ergebnis gibt, dann solltest Du das z.B. mit einer Liste oder einem Array organisieren. Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 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