Einzelnen Beitrag anzeigen

LiB

Registriert seit: 22. Mär 2010
11 Beiträge
 
#4

Re: idHTTP.get Threads ( Multi Download )

  Alt 9. Apr 2010, 12:48
Delphi-Quellcode:
type
  TDownload = class(TThread)
  private
    URL:String;
    TITLE:String;
    HTTP:TidHTTP;
  protected
    procedure Execute; override;
  public
    procedure Set_Data(pURL,TITLE:String);
  end;
Das soll meine Thread Klasse sein

Delphi-Quellcode:
procedure TDownload.Execute;
var FS:TFileStream;
    slTime,elTime:TDateTime;
    fail:Boolean;
    Leechedsize,Filesize:int64;
begin
 http := TidHTTP.Create;
 dir := appdir + 'data/download/';

 FOrm1.p_download.Caption := 'Action: Trying ' + rls;

 Form1.lv_download.Items.Add.Caption := TITLE;
 gitem := Form1.lv_download.Items.Count-1;

 if DirectoryExists(dir) then
  begin
   Form1.lv_download.Items[gitem].SubItems.Add('Already Exists');
  end
 else
  begin
   Form1.p_download.Caption := 'Action: Start Downloading ' + rls;
   Form1.lv_download.Items[gitem].SubItems.Add('Downloading');
   slTime := now;
   FS:=Tfilestream.Create(dir + '/' + TITLE,fmCreate);
   fail := False;

   leechedsize := 0;
   http.Head(URL);
   filesize := http.Response.ContentLength;
   Form1.lv_download.Items[gitem].SubItems[0] := 'Downloading ('+GetSizeName(leechedsize)+'/'+GetSizeName(filesize)+')';
   repeat
    if (filesize-leechedsize) > cFileSplitSize then
     Http.Request.Range := Format('%d-%d', [leechedsize, (leechedsize+cFileSplitSize-1)])
    else
     Http.Request.Range := Format('%d-', [leechedsize]);

    try
     HTTP.Get(URL,FS);
    except
     fail := True;
    end;

    Form1.lv_download.Items[gitem].SubItems[0] := 'Downloading ('+GetSizeName(leechedsize)+'/'+GetSizeName(filesize)+')';
    leechedsize := leechedsize+cFileSplitSize;
   until (leechedsize >= filesize);

   elTime := now - slTime;

   if fail then
    Form1.lv_download.Items[gitem].SubItems[0] := 'Download Failed'
   else
    Form1.lv_download.Items[gitem].SubItems[0] := 'Finished ('+FormatDateTime('hh:mm:ss',elTime)+')';

    Form1.p_download.Caption := 'Action: Finished ' + rls;

  end;

 http.free;
 Inc(Form1.CurThreads,-1);
end;
so schaut die execute procedure aus...
und ich komme darauf, weil wenn ich nun einen Thread aufrufe, startet dieser und zeigt mir immer etwas Fortschritt an, aber sobald ich den zweiten Thread starte, kommt doch nichts mehr sondern nur noch beim zweiten...

aufrufen tue ich den Thread über einen Timer:

(DownQueue ist eine TList)
Delphi-Quellcode:
 if CurThreads < MaxThreads then
  begin
   if not DownQueue.isEmpty then
    begin
     Inc(CurThreads,1);
     DownQueue.toFirst;
     load := TDownload.Create(true);
     with (LeechQueue.getItem AS TLeechSettings) do
      load.Set_Data(Get_url,Get_title);

     DownQueue.remove;
     load.Execute;
    end;
  end;
Zitat:
Irgendwas passt das nicht zusammen. Wenn du mit Threads arbeitest brauchst du kein Antifreece. Antifreece arbeitet mit Application.ProcessMessages welches nur auf den Hauptthread Anwendung findet.
Hat mich auch stark gewundert.. aber trotz Thread hat Die Form sonst gehakt..
Habe ich vielleicht etwas beim Thread selber bzw. beim Aufbau falch gemacht oder vergessen ?
  Mit Zitat antworten Zitat