![]() |
Frage zu Threads
Hallo,
ich habe ein nettes Beispiel zu Multithreading gefunden ![]() und versuche das zu verstehen. An folgender Stelle habe ich ein Verständnisproblem:
Delphi-Quellcode:
Was soll "while true" bewirken? Das stimmt doch immer? Andererseits läuft der Thread nicht mehr ordnungsgemäß, wenn man die while-Zeile und die zugehörige end-Zeile auskommentiert.
procedure TProgressBarThread.Execute;
begin while true do begin Synchronize(MoveTh); Sleep(50); end; end; ??? Gruß, Thomas |
Re: Frage zu Threads
Ein Thread läuft so lange, wie die Execute-Methode ausgeführt wird. Wird diese verlassen, wird auch der Thread beendet.
Besser wäre:
Delphi-Quellcode:
Terminated ist eine Eigenschaft von TThread. Diese kann man von außen auf False setzen und so den Thread von außen kontrolliert beenden.
procedure TProgressBarThread.Execute;
begin while not Terminated do begin Synchronize(MoveTh); Sleep(50); end; end; Ein weiteres Tutorial mit Hintergrundinformationen findest du hier: http:://delphitutorials.michael-puff.de |
Re: Frage zu Threads
Zitat:
Oder bin ich falsch? Gruß aus den Bergen Günter |
Re: Frage zu Threads
Zitat:
Hier würde also ein Timer (mit 50ms) ein ähnliches Ergebnis liefern. :angel2: Wir hatten hier schonma das Problem, daß durch sowas ähnliches der ganze Hauptthread blockiert wurde. Sleep war noch kürzer, bzw. garnicht vorhanden und als dann noch mehrere dieser Threads liefen, dann ging nichts mehr, da dieses Synchronize soooo lange und Oft den Hauptthread blockierte, daß er zu nichts anderem mehr Zeit hatte. |
Re: Frage zu Threads
Na ja, Luckie hat ja auch nur ein Beispiel für das Gerüst geliefert. Echte Inhalte sollten dann schon rein.
Wozu nimmt man einen Thread? Wenn man nicht weiß, wie lange eine Aktion dauert und das Programm während der Abarbeitung nicht stehen bleiben soll. Nimm mal an, Du willst eine Datei öffnen, den Inhalt untersuchen und das Ergebnis auf dem Bildschirm anzeigen. Du weißt aber nicht, wie lange das dauert, zumal ein anderer Thread in die Datei schreibt. Ein Timer könnte also zu häufig feuern. Also nimmst Du einen Thread.
Delphi-Quellcode:
Dein (Haupt-)Programm bleibt voll funktionsfähig während die Anweisung ausgeführt wird, egal ob es nun sehr schnell oder sehr langsam geht.
procedure ParseThread.Execute;
begin while not Terminated do begin ParseResult := LoadAndParseFile; //ParseResult muss ein Member des Threads sein oder eine globale Variable (pfui Teufel, wer macht den sowas) Synchronize(ShowParseResult); end; end; Den Zugriff auf die Datei muss dann synchronisiert werden, damit der Schreib-Thread nicht mit dem Lese-Thread zusammenrasselt. Grüße, Messie |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:25 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-2025 by Thomas Breitkreuz