AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi TThread.WaitFor verursacht einfrieren des Programmes
Thema durchsuchen
Ansicht
Themen-Optionen

TThread.WaitFor verursacht einfrieren des Programmes

Ein Thema von MrKnogge · begonnen am 29. Mär 2008 · letzter Beitrag vom 29. Mär 2008
Antwort Antwort
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#1

TThread.WaitFor verursacht einfrieren des Programmes

  Alt 29. Mär 2008, 15:57
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
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: TThread.WaitFor verursacht einfrieren des Programmes

  Alt 29. Mär 2008, 19:59
Warum machst du überhaupt waitfor? Dann kanst du doch den Thread auch gleich im Mainthread lassen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#3

Re: TThread.WaitFor verursacht einfrieren des Programmes

  Alt 29. Mär 2008, 20:11
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.
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: TThread.WaitFor verursacht einfrieren des Programmes

  Alt 29. Mär 2008, 20:15
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#5

Re: TThread.WaitFor verursacht einfrieren des Programmes

  Alt 29. Mär 2008, 20:32
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 ?
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: TThread.WaitFor verursacht einfrieren des Programmes

  Alt 29. Mär 2008, 20:42
Mach mal aus waifor --> resume!
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#7

Re: TThread.WaitFor verursacht einfrieren des Programmes

  Alt 29. Mär 2008, 21:15
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.
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: TThread.WaitFor verursacht einfrieren des Programmes

  Alt 29. Mär 2008, 21:21
Könnte das eventuell daran liegen?

FreeOnTerminate := true;
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
Klaus
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#9

Re: TThread.WaitFor verursacht einfrieren des Programmes

  Alt 29. Mär 2008, 21:24
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
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 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