Einzelnen Beitrag anzeigen

Lefko

Registriert seit: 31. Jul 2003
359 Beiträge
 
Delphi 6 Enterprise
 
#1

Die erste Thread-Programmierung...

  Alt 30. Okt 2003, 23:19
Hallo Freunde,

ich hab mich grad das erste mal an threads rangewagt und mir dazu ein threadtutorial durchgelesen, das anhand der Thread-demo bei borland einige funktionen etc. erklärt.
Nu will ich einen thread schreiben, der den befehl URLDownloadToFile ausführt (die Form ist sonst immer so ewig lang nicht "ansprechbar" und sieht aus wie abgestürzt...) und dabei einige Parameter aus der Form1 verwendet!

da ich wie gesagt noch überhaupt keine ahnung davon hab, weiss ich auch nicht, was an meinem text so unglaublich falsch ist, ich hab probiert, es getreu dem beispiel zu machen!

hier der text, ich wäre dankbar, wenn ihr mir die fehler erklärtet!

Delphi-Quellcode:
unit ThreadUnit;

interface

uses
  UrlMon, StdCtrls, ExtCtrls, Windows, SysUtils, Classes, Dialogs, Controls;

type
  TDownloadThread = class(TThread)
  private
       { Private declarations }
     BILDNAME, //
     URL_TEIL1, //
     URL_TEIL2, //Das sind die Texte von 5 LabeledEdits aus der Form1.
     VERZEICHNIS : string; //Sie sollen im Thread verwendet werden (also müssen sie
     ANZAHL : integer; //übergeben werden (in Thread.Create), richtig?)
     procedure UpdateForm1;
  protected
     procedure Execute; override;
     procedure DownloadFile;
  public
       { Public declarations }
     constructor Create(LEdit1,LEdit2,LEdit3,LEdit4,LEdit5 : TLabeledEdit); //stimmt das?
    end;

implementation

var z : integer;

{ Important: Methods and properties of objects in VCL or CLX can only be used
  in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure TDownloadThread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }


{ TDownloadThread }

procedure TDownloadThread.UpdateForm1; //wie im obigen Standard-Beispiel!
begin
Form1.Label1.caption := 'Datei ' + IntToStr(z) + ' von ' + IntToStr(ANZAHL) + ' fertig.'; //geht nicht!
end;


procedure DownloadFiles;
var URL, ORT : string;
begin
z := 1;

if ForceDirectories(Verzeichnis) then
while z <= ANZAHL do begin //hier kennt Delphi die
                     URL := URL_TEIL1 + InttoStr(z) + URL_TEIL2; //BEZEICHNER nie!
                     ORT := VERZEICHNIS + BILDNAME + IntToStr(z) + '.jpg'; //weshalb? wo müssen sie
                                                                           //deklariert werden? UrlDownloadtoFile(nil, PCHAR(URL), PCHAR(ORT), 0, nil);//sollen ja aus der
                                                                           //Form1 kommen (Edits)

                     Synchronize(UpdateForm1); //hab ich nach dem obigen Standard-Beispiel gemacht!
                     inc(z);
                     end;
end;



constructor TDownloadThread.Create(LEdit1, LEdit2, LEdit3, LEdit4, LEdit5 : TLabeledEdit);
begin
URL_TEIL1 := LEdit1.text; //Kann man das hier so zuordnen?!
URL_TEIL2 := LEdit2.text;
ANZAHL := StrToInt(LEdit3.text); //Es sollen eine best. Anzahl Bilder gedownloadet werden
VERZEICHNIS := LEdit4.text;
BILDNAME := LEdit5.text; //Benennung der geladenen Bilder (+fortlaufende Nr.)
FreeOnTerminate := True;
end;



procedure TDownloadThread.Execute;
begin
  { Place thread code here }
DownloadFiles;
end;

end.


...


// so wird der Thread generiert (in Unit1):

TDownloadThread.Create(LabeledEdit1,
                       LabeledEdit2,
                       LabeledEdit3,
                       LabeledEdit4,
                       LabeledEdit5 : TLabeledEdit);

MfG Lefko.
Johannes
-=[Nennst du meinen Namen, bin ich schon nicht mehr da]=-
  Mit Zitat antworten Zitat