![]() |
Indy Thread Status zuordnen ?
Hi,
ich habe einen Thread für die Idhttp erstellt.
Delphi-Quellcode:
Ich habe vorher noch nicht wirklich mit Threads gearbeitet, deswegen frage ich mich nun wie ich wenn ich den Thread dreimal hintereinander ausführe und somit 3 Downloads parallel laufen an die 3 verschiedenen IdHTTP1Work, IdHTTP1WorkBegin und IdHTTP1WorkEnd kommen kann um die den Fortschritt des jeweiligen Downloads anzeigen zu lassen.
unit Unit3;
interface uses Classes, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP; type IdhttpThread = class(TThread) private { Private declarations } THIdHTTP: TIdHTTP; public { Public declarations } constructor Create(CreateSuspended: Boolean); destructor Destroy; override; procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); procedure IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer); procedure Execute; override; end; implementation 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; THIdHTTP.OnWorkEnd := IdHTTP1WorkEnd; THIdHTTP.Get('http://beispiel.de/Beispiel.exe'); end; procedure IdhttpThread.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); begin // Mach was end; procedure IdhttpThread.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer); begin // Mach was end; procedure IdhttpThread.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin // Mach was end; end. Mfg Yannic |
Re: Indy Thread Status zuordnen ?
Hi,
Du must einfach 3 Instanzen des Threads erstellen alla :
Delphi-Quellcode:
die Events werden von jedem Thread einzelnd verwaltet, weil es ja auch 3 verschiedene Instanzen von TIdHTTP sind.
// ....
Var httpthd1 : IdhttpThread ; httpThd2 : IdhttpThread ; httpThd3 : IdhttpThread ; begin // .... httpThd1 := IdHttpThread.Create(true); httpThd2 := IdHttpThread.Create(true); httpThd3 := IdHttpThread.Create(true); // ... Threads starten httpThd1.resume; // ab hier läuft Thead 1 httpThd2.resume; // ab hier Thread 2 HttpThd3.resume; // ... Trotzdem wird oben genannten Source fehlschlagen, weil jetzt alle 3 Threads versuchen werden die gleiche Datei/URL runter zu laden. Du müßtest die Thread Klasse um eine Property URL oder ähnliches erweitern und diese nach dem Create und vor dem Resume setzen. Greetz Data |
Re: Indy Thread Status zuordnen ?
Hi,
Danke schonmal für die Hilfe :) wenn ich die Threads über
Delphi-Quellcode:
Dann sind die ja aber fest definiert oder ? Es kann sein das jenachdem mal 3 Downloads oder mal auch 10 Downloads gleichzeitig erfolgen sollen. Gibt es da eine lösung das ganze dynamisch zu halten ?
Var
httpthd1 : IdhttpThread ; httpThd2 : IdhttpThread ; httpThd3 : IdhttpThread ; Achja nochwas wie komme ich von meiner Mainform eigentlich an die Events des jeweiligen Threads kommen um beispielsweise Download Zeit, Geschwindigkeit usw. zu berechnen ? Mfg Yannic |
Re: Indy Thread Status zuordnen ?
Hi,
Du must nicht von der Main-Form auf die Events der Threads zugreifen, sondern umgekehrt du must aus dem Thread/Threads auf die Main-Form zugreifen. !! Vorsicht sämtliche GUI Zugriffe müssen syncronisiert werden !!!! Zu dem Thema gibts hier im Thema schon einiges. In meinem Bsp. waren es fest 3 Threads, man könnte aber auch ein thdArray : Array of IdhttpThread; machen oder alle THreads dynamisch erstellen und in einer Liste speichern .... Das ganuze Thema Threads ist nicht in 5 Minuten erklärt, ich glaube bei Delphi-Treff gibt es dazu ein ein gutes Einsteiger Tutorial. Gruß Data |
Re: Indy Thread Status zuordnen ?
Hi,
ja stimmt das Thema ist ein wenig komplex, die Delphi-treff Erklärung habe ich gerade durch nur leider das dort genutzte Beispiel nicht mehr. Wenn ich jetzt aus dem Thread in den OnX procedures Synchronize(MainForm.Procedurename); aufrufen lasse, wie erhalte ich dann in der MainForm.Procedurename die Infos ? Irgendwie müsste ja dann procedure IdhttpThread.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); AWorkCount an die MainForm.Procedurename übergeben werden, oder würde es schon so reichen: MainForm.Procedurename(Get_AWorkCount: integer); und der Aufruf sieht dann so aus Synchronize(MainForm.Procedurename(AWorkCount)); ? Nur dann stellt sich mir leider nochmal die Frage von vorher. Ich kann nun zwar zwischen den einuelnen threads unterscheiden, nur wie kann ich in der MainForm.Procedurename rausfinden von welchem Thread nun die AWorkCount info kommt ? Mfg Yannic |
Re: Indy Thread Status zuordnen ?
Hi Yanni,
ich möchte jetzt kein komplettes Bsp. programmieren dazu fehlt mir im Moment die Zeit, außerdem gibt es hier noch genug andere die das auch hinbekommen. Aber hier mal ein Ansatz für Dich: Ich gehe mal davon aus das Du eine Progressbar aktualisieren willst, während des Downloads. Deshalb must Du Deine ThreadKlasse um eine Eingenschaft TargetProgressBar : TProgressbar erweitern. Außerdem eine private Variable in Thread iProgress : integer; Und ganz wichtige eine private Procedure UpdateProgressbar; Unrwe dann beim erzeugen der Threads:
Delphi-Quellcode:
Im OnBegin, OnWork und OnWorkEnd setzt Du die Variable iProgress und dann
Var
httpthd1 : IdhttpThread ; httpThd2 : IdhttpThread ; httpThd3 : IdhttpThread ; begin // .... httpThd1 := IdHttpThread.Create(true); httpThd1.TargetProgressbar := MainForm.Progressbar1; httpThd2 := IdHttpThread.Create(true); httpThd2.TargetProgressbar := MainForm.Progressbar2; httpThd3 := IdHttpThread.Create(true); httpThd3.TargetProgressbar := MainForm.Progressbar3; // ... Threads starten httpThd1.resume; // ab hier läuft Thead 1 httpThd2.resume; // ab hier Thread 2 HttpThd3.resume; // ... syncronisierst du UpdateProgress mit :
Delphi-Quellcode:
Die procedure UpdateProgress sieht dann ungefähr so aus:
syncronize(UpdateProgress);
Delphi-Quellcode:
Das muss jetzt aber reichen,
procedure idhttpThread.updateProgress;
begin if Assigned(TargetProgressbar) then TargetProgressbar.position := iProgress; end; Greetz Data |
Re: Indy Thread Status zuordnen ?
Hi,
danke das hat geholfen :) Mfg Yannic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 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