AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Indy Thread Status zuordnen ?

Ein Thema von Blamaster · begonnen am 19. Mär 2010 · letzter Beitrag vom 20. Mär 2010
Antwort Antwort
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#1

Indy Thread Status zuordnen ?

  Alt 19. Mär 2010, 13:41
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
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Indy Thread Status zuordnen ?

  Alt 19. Mär 2010, 14:19
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#3

Re: Indy Thread Status zuordnen ?

  Alt 19. Mär 2010, 14:55
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
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Indy Thread Status zuordnen ?

  Alt 19. Mär 2010, 15:37
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#5

Re: Indy Thread Status zuordnen ?

  Alt 19. Mär 2010, 18:04
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
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Indy Thread Status zuordnen ?

  Alt 19. Mär 2010, 20:28
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 :
  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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#7

Re: Indy Thread Status zuordnen ?

  Alt 20. Mär 2010, 01:18
Hi,

danke das hat geholfen

Mfg Yannic
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz