Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Frage zu Threads (https://www.delphipraxis.net/142058-frage-zu-threads.html)

iphi 21. Okt 2009 11:32


Frage zu Threads
 
Hallo,

ich habe ein nettes Beispiel zu Multithreading gefunden

http://neftali.clubdelphi.com/ejempl...de_threads.zip

und versuche das zu verstehen.

An folgender Stelle habe ich ein Verständnisproblem:

Delphi-Quellcode:
procedure TProgressBarThread.Execute;
begin

    while true do begin
      Synchronize(MoveTh);
      Sleep(50);
    end;

end;
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.

???

Gruß, Thomas

Luckie 21. Okt 2009 11:39

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:
procedure TProgressBarThread.Execute;
begin
  while not Terminated do
  begin
    Synchronize(MoveTh);
    Sleep(50);
  end;
end;
Terminated ist eine Eigenschaft von TThread. Diese kann man von außen auf False setzen und so den Thread von außen kontrolliert beenden.

Ein weiteres Tutorial mit Hintergrundinformationen findest du hier: http:://delphitutorials.michael-puff.de

Tyrolean 21. Okt 2009 14:40

Re: Frage zu Threads
 
Zitat:

Zitat von Luckie
Delphi-Quellcode:
procedure TProgressBarThread.Execute;
begin
  while not Terminated do
  begin
    Synchronize(MoveTh);
    Sleep(50);
  end;
end;

Wenn ich aber nicht ganz auf dem Schlauch stehe nutzt dieser Thread gar nichts, weil ja durch Synchronize der HauptThread gestoppt wird. Da läuft also eigentlich gar nichts nebeneinander.
Oder bin ich falsch?

Gruß aus den Bergen
Günter

himitsu 21. Okt 2009 14:42

Re: Frage zu Threads
 
Zitat:

Zitat von Tyrolean
Wenn ich aber nicht ganz auf dem Schlauch stehe ...

Jupp, wenn man neben Synchronize sonst nix macht (Sleep zählt nicht).

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.

messie 21. Okt 2009 16:14

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:
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;
Dein (Haupt-)Programm bleibt voll funktionsfähig während die Anweisung ausgeführt wird, egal ob es nun sehr schnell oder sehr langsam geht.
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 01:49 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