Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Indy Thread Status zuordnen ? (https://www.delphipraxis.net/149355-indy-thread-status-zuordnen.html)

Blamaster 19. Mär 2010 12:41


Indy Thread Status zuordnen ?
 
Hi,

ich habe einen Thread für die Idhttp erstellt.

Delphi-Quellcode:
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.
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.

Mfg Yannic

DataCool 19. Mär 2010 13:19

Re: Indy Thread Status zuordnen ?
 
Hi,

Du must einfach 3 Instanzen des Threads erstellen alla :

Delphi-Quellcode:
// ....
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; // ...
die Events werden von jedem Thread einzelnd verwaltet, weil es ja auch 3 verschiedene Instanzen von TIdHTTP sind.
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

Blamaster 19. Mär 2010 13:55

Re: Indy Thread Status zuordnen ?
 
Hi,

Danke schonmal für die Hilfe :)

wenn ich die Threads über

Delphi-Quellcode:
Var
  httpthd1 : IdhttpThread ;
  httpThd2 : IdhttpThread ;
  httpThd3 : IdhttpThread ;
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 ?

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

DataCool 19. Mär 2010 14:37

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

Blamaster 19. Mär 2010 17:04

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

DataCool 19. Mär 2010 19:28

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:
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; // ...
Im OnBegin, OnWork und OnWorkEnd setzt Du die Variable iProgress und dann
syncronisierst du UpdateProgress mit :
Delphi-Quellcode:
  syncronize(UpdateProgress);
Die procedure UpdateProgress sieht dann ungefähr so aus:
Delphi-Quellcode:
procedure idhttpThread.updateProgress;
begin
  if Assigned(TargetProgressbar) then
    TargetProgressbar.position := iProgress;
end;
Das muss jetzt aber reichen,

Greetz Data

Blamaster 20. Mär 2010 00:18

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