Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TThread.WaitFor verursacht einfrieren des Programmes (https://www.delphipraxis.net/111100-tthread-waitfor-verursacht-einfrieren-des-programmes.html)

MrKnogge 29. Mär 2008 14:57


TThread.WaitFor verursacht einfrieren des Programmes
 
Moin,

ich nutze die Unit UDownThread aus diesem Beitrag um eine Datei herunter zu laden, dies klappt auch super.

Ich möchte dies in einem thread tun, da mir das Programm ansonsten hin und wieder trotz Application.ProzessMessages und TidAntiFreeze für kurze Zeit einfriert, bzw. die Oberfläche nicht neu gezeichnet wird, nachdem sie durch andere Fenster (bsp. Explorer) verdeckt wurde.

Nun möchte ich mehrere Dateien nacheinander nicht parallel! herunterladen, und dachte mir, ich könnte mit WaitFor einfach warten, bis der vorherige Download abgeschlossen ist, aber nun friert mir das Programm bei WaitFor immer komplett ein. Die Datei (welche nur ein paar Kilobyte groß ist) wird nicht heruntergeladen und das Programm erwacht auch nicht mehr.

Delphi-Quellcode:
procedure TForm1.MyDownloadTest(DownFiles, FileNames: TStrings);
var
  i: integer;
  Down: TDownThread;
begin
  for i := 0 to DownFiles.Count-1 do
  begin
    Down := TDownThread.Create(true);
    with Down do
    begin
      FreeOnTerminate := true;
      OnWork := OnThreadWork;
      OnWorkBegin := OnThreadWorkBegin;
      URL := DownFiles[i];
      FileName := FileNames[i];
      WaitFor;
    end;
  end;
end;
Hab ich einen Denkfehler in meinem Code, oder muss ich um WaitFor benutzen zu können, etwas an der DownThread-Klasse ändern ?

Grüße
Christian

sirius 29. Mär 2008 18:59

Re: TThread.WaitFor verursacht einfrieren des Programmes
 
Warum machst du überhaupt waitfor? Dann kanst du doch den Thread auch gleich im Mainthread lassen. :gruebel:

MrKnogge 29. Mär 2008 19:11

Re: TThread.WaitFor verursacht einfrieren des Programmes
 
Habe ich doch geschrieben, wenn ich es im Mainthread laufen lasse, friert mir kurzzeitig immer wieder das Programm ein und die Oberfläche wird nicht neugezeichnet, nach dem sie überdeckt wurde.

SirThornberry 29. Mär 2008 19:15

Re: TThread.WaitFor verursacht einfrieren des Programmes
 
Naja, mit WaitFor wird ja gewartet bis der Thread fertig ist und somit werden keine Messages verarbeitet. Und warum nichts runterlädt sieht man wohl erst wenn man deinen Thread-Quelltext sieht.

MrKnogge 29. Mär 2008 19:32

Re: TThread.WaitFor verursacht einfrieren des Programmes
 
Der Thread Quelltext ist oben verlinkt, ohne Schleife und Waitfor funktioniert es wunderbar.

@SirThornberry
Heist das, ich müsste die Schleife in den Thread verlagern ?

sirius 29. Mär 2008 19:42

Re: TThread.WaitFor verursacht einfrieren des Programmes
 
Mach mal aus waifor --> resume!

MrKnogge 29. Mär 2008 20:15

Re: TThread.WaitFor verursacht einfrieren des Programmes
 
:wall: Ich hab resume vergessen, habs nun folgender Maßen geändert:

Delphi-Quellcode:
procedure TForm1.MyDownloadTest(DownFiles, FileNames: TStrings);
var
  i: integer;
  Down: TDownThread;
begin
  for i := 0 to DownFiles.Count-1 do
  begin
    Down := TDownThread.Create(true);
    with Down do
    begin
      FreeOnTerminate := true;
      OnWork := OnThreadWork;
      OnWorkBegin := OnThreadWorkBegin;
      URL := DownFiles[i];
      FileName := FileNames[i];
      resume;
      WaitFor;
    end;
  end;
end;
Nun läd er die erste Datei herunter, doch danach bricht das Programm mit der Fehlermeldung "Das Handle ist ungültig (6)." ab.

Klaus01 29. Mär 2008 20:21

Re: TThread.WaitFor verursacht einfrieren des Programmes
 
Könnte das eventuell daran liegen?

Delphi-Quellcode:
FreeOnTerminate := true;

Zitat:

Zitat von DelphiHilfe
Description

Set FreeOnTerminate to True if you don’t want to explicitly destroy threads after they finish executing. When FreeOnTerminate is False, the thread object must be explicitly destroyed in application code.

Warning: When FreeOnTerminate is True, the Execute method may run and then free the thread before your application can execute the next line of code. Thus, you should not call any methods of the thread object when FreeOnTerminate is True unless you create the thread in a suspended state.

Grüße
Klaus

MrKnogge 29. Mär 2008 20:24

Re: TThread.WaitFor verursacht einfrieren des Programmes
 
Tatsache,

Delphi-Quellcode:
procedure TForm1.MyDownloadTest(DownFiles, FileNames: TStrings);
var
  i: integer;
  Down: TDownThread;
begin
  for i := 0 to DownFiles.Count-1 do
  begin
    Down := TDownThread.Create(true);
    with Down do
    begin
      FreeOnTerminate := false;
      OnWork := OnThreadWork;
      OnWorkBegin := OnThreadWorkBegin;
      URL := DownFiles[i];
      FileName := FileNames[i];
      resume;
      WaitFor;
      Free;
    end;
  end;
end;
Funktioniert. Vielen Dank euch allen :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:30 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