![]() |
Threads und IdHTTP
Hi
ich hab bisher mit Threads noch nix gemacht und nun ein kleines Problem mit meinem Code, hab schon mehrere seiten durchgeschaut sonst würde der code nicht so aussehen ^^ ist ne mischung aus verschiedenen gefundenen Beispielen. Hab immo nur folgende fehlermeldungen:
Code:
Ich gehe mal von aus die letzten 3 Fehlermeldungen sind folgefehler durch den ersten, allerdings hab ich ka wie ich den beheben soll.
[DCC Fehler] Unit5.pas(63): E2037 Deklaration von 'Get' unterscheidet sich von vorheriger Deklaration
[DCC Fehler] Unit5.pas(67): E2003 Undeklarierter Bezeichner: 'THIdHTTP' [DCC Fehler] Unit5.pas(67): E2003 Undeklarierter Bezeichner: 'xurl' [DCC Fehler] Unit5.pas(68): E2003 Undeklarierter Bezeichner: 'xfilename' Hab schon verschiedene sachen ausprobiert allerdings ohne erfolg.
Delphi-Quellcode:
Mfg
unit Unit5;
interface uses Classes ,Windows ,IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP; type TThreadedProc= procedure(xurl, xfilename: String); type IdhttpThread = class(TThread) THIdHTTP: TIdHTTP; procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); private FParam1 : String; FParam2 : String; FProc : TThreadedProc; { Private declarations } protected procedure Execute; override; public { Public declarations } property Param1 : String read FParam1 write FParam1; property Param2 : String read FParam2 write FParam2; property GET : TThreadedProc read FProc write FProc; constructor Create(CreateSuspended: Boolean); destructor Destroy; override; end; implementation uses Unit1; { Download } constructor IdhttpThread.Create(CreateSuspended: Boolean); begin inherited; THIdHTTP := TIdHTTP.Create(nil); end; destructor IdhttpThread.Destroy; begin THIdHTTP.Free; inherited; end; procedure IdhttpThread.Execute; begin THIdHTTP.OnWork := IdHTTP1Work; THIdHTTP.OnWorkBegin := IdHTTP1WorkBegin; try GET(FParam1, FParam2); except end; { Thread-Code hier einfügen } end; procedure IdhttpThread.Get(xurl, xfilename: String); var x : TStringList; begin x := Tstringlist.Create; x.Text := THIdHTTP.Get(xurl); x.SaveToFile(xfilename); end; procedure IdhttpThread.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); begin if Form1.updatestatus = 1 then Form1.ProgressBar1.Position := AWorkCount; if Form1.updatestatus = 2 then Form1.ProgressBar2.Position := AWorkCount; if Form1.updatestatus = 3 then Form1.ProgressBar3.Position := AWorkCount; end; procedure IdhttpThread.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); begin if Form1.updatestatus = 1 then Form1.ProgressBar1.Max := AWorkCountMax; if Form1.updatestatus = 2 then Form1.ProgressBar2.Max := AWorkCountMax; if Form1.updatestatus = 3 then Form1.ProgressBar3.Max := AWorkCountMax; end; end. |
AW: Threads und IdHTTP
Wozu die ThreadProc? Und warum machst du nicht das, was dir Delphi sagt und fügst an der betreffenden Stelle den Thread Code ein mit: IdHTTP:Get(....);
Und das
Delphi-Quellcode:
Verursacht bei mir ganz großes Aua. Wenn man eine neue Unit für einen Thread erstellt, dann wird einem doch im Kommentar gesagt, dass man nicht einfach so auf VCL Elemente des Hauptthreads zugreifen darf, sondern diese Zugriffe mittels Synchronize synchronisiert werden müssen.
procedure IdhttpThread.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64); begin if Form1.updatestatus = 1 then Form1.ProgressBar1.Position := AWorkCount; if Form1.updatestatus = 2 then Form1.ProgressBar2.Position := AWorkCount; if Form1.updatestatus = 3 then Form1.ProgressBar3.Position := AWorkCount; end; procedure IdhttpThread.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); begin if Form1.updatestatus = 1 then Form1.ProgressBar1.Max := AWorkCountMax; if Form1.updatestatus = 2 then Form1.ProgressBar2.Max := AWorkCountMax; if Form1.updatestatus = 3 then Form1.ProgressBar3.Max := AWorkCountMax; end; Außerdem wird dein IdHTTP Objekt nirgends frei gegeben, wenn ich das richtig sehe. Und wenn keine Ahnung von etwas hat, dann liest man sich doch zumindest mal ein Tutorial durch oder? Und da sollten solche Sachen eigentlich drin stehen. |
AW: Threads und IdHTTP
und wie übergebe ich die url an dieses get im execute ?
da es immer eine andere ist kann ich diese ja nicht festsetzen. Ein tutorial is die eine sache es bringt mir aber nur was wenn auch das behandelt wird was ich machen will. Mit Synchronize hab ich nix gefunden und mit dem übergeben eines Strings auch nicht. |
AW: Threads und IdHTTP
Gib deiner Threadklasse öffentliche Attribute. Dort kannst du dann beim Erzeugen die URL übergeben. Und zu Synchronize solltest du was in der Hilfe finden. Und wenn ich mich nicht irre, macht dir Delphi sogar in seinen Kommentar sogar ein Beispiel, wie man Synchronize anwendet.
|
AW: Threads und IdHTTP
Formular:
Delphi-Quellcode:
Thread
type
TForm17 = class(TForm) Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private public procedure UpdateLabel(BytesDone: Integer); end; var Form17: TForm17; implementation {$R *.dfm} uses Unit18; // Thread Unit procedure TForm17.Button1Click(Sender: TObject); var HTTPThread: TIdHTTPThread; begin HTTPThread := TIdHTTPThread.Create(True); // angehalten erzeugen HTTPThread.Url := 'http://www.xxxxxx.pdf'; HTTPThread.Filename := 'd:\test.pdf'; HTTPThread.FreeOnTerminate := True; HTTPThread.Resume; // ...und starten end; procedure TForm17.UpdateLabel(BytesDone: Integer); begin Label1.Caption := IntToStr(BytesDone); end;
Delphi-Quellcode:
unit Unit18;
interface uses Classes, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP; type TIdHTTPThread = class(TThread) private FURL: AnsiString; FFilename: AnsiString; FBytesDone: Int64; IdHTTP: TIdHTTP; procedure OnWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); procedure Updatelabel; public Constructor Create(CreateSuspended: Boolean); Destructor Destroy; override; property Url: AnsiString read FURL write FUrl; property Filename: AnsiString read FFilename write FFilename; protected procedure Execute; override; end; implementation { Wichtig: Methoden und Eigenschaften von Objekten in visuellen Komponenten dürfen nur in einer Methode namens Synchronize aufgerufen werden, z.B. Synchronize(UpdateCaption); und UpdateCaption könnte folgendermaßen aussehen: procedure TIdHTTPThread.UpdateCaption; begin Form1.Caption := 'Aktualisiert in einem Thread'; end; } { TIdHTTPThread } uses Unit17; // Formular Unit constructor TIdHTTPThread.Create(CreateSuspended: Boolean); begin inherited Create(Suspended); IdHTTP := TIdHTTP.Create; IdHTTP.OnWork := OnWork; end; destructor TIdHTTPThread.Destroy; begin IdHTTP.Free; inherited; end; procedure TIdHTTPThread.Execute; var DestStream: TFileStream; begin DestStream := TFileStream.Create(Filename, fmCreate); try IdHTTP.Get(Url, DestStream); finally DestStream.Free; end; end; procedure TIdHTTPThread.OnWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); begin FBytesDone := AWorkCount; Synchronize(Updatelabel); end; procedure TIdHTTPThread.Updatelabel; begin Form17.UpdateLabel(FBytesDone) end; end. |
AW: Threads und IdHTTP
oh danke hab mein tool erstmal ohne threads weitergemacht
werd das entweder später noch umbauen oder aber in der nächsten version abändern. sollte ich also noch probleme damit haben kann das erst später kommen. tutorials sind das eine ein funktionierender code sagt mir manchmal mehr als nen 5 seiten tutorial, da ich damit rumtesten kann. ist jedenfalls meine erfahrung das ich so schneller etwas verstehe. |
AW: Threads und IdHTTP
Da man den Thread sowieso ableitet, kann man sich auch einen Constructor, mit passenden Parametern erstellen.
|
AW: Threads und IdHTTP
Ich mag Routinen mit langen Argumentenlisten nicht. ;)
|
AW: Threads und IdHTTP
Im Prinzip sind es nur 2 Parameter, also einer mehr, als das jetzige True. :stupid:
[edit] OK, drei. URL, Filename und das UpdateLabel, welches man vergessen und hart verlinkt hat. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz