TObject - Indy onwork

Rund um die LCL und andere Komponenten
Antworten
useo6
Beiträge: 4
Registriert: Mo 20. Okt 2008, 16:08

TObject - Indy onwork

Beitrag von useo6 »

Moin @ all,

ich habe erst am Wochenende mit Lazarus angefangen und probiere momentan ein bisschen mit Threads rum. Das ganze Funktioniert auch schon ganz gut... das Problem ist nur, dass ich von den Threads keine Fortschrittsanzeige hinbekomme, d.h. wenn ich onwork aufrufe, dann erhalte ich den folgenden Fehler:

Code: Alles auswählen

unit1.pas(70,32) Error: Incompatible type for arg no. 1: Got "Class Of TObject", expected "TObject"
 
Mein aktueller Source ist folgender:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, Buttons, IdHTTP, ComCtrls, IdComponent;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
  { TMyThread }
 
  TMyThread = class(TTHread)
  client: TIdHTTP;
  procedure Status(Sender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
  private
     test: string;
     procedure ShowStatus;
  protected
     procedure Execute; override;
  public
     constructor Create(CreateSuspended: boolean);
  end;
 
var
  Form1: TForm1;
 
implementation
 
procedure TForm1.Button1Click(Sender: TObject);
var
   MyThread: TMyThread;
begin
   MyThread := TMyThread.Create(True);
 
   MyThread.Resume;
end;
 
{ MyThread }
 
procedure TMyThread.ShowStatus;
begin
Form1.Label2.Caption:=test;
end;
 
procedure TMyThread.Execute;
var stream: TMemoryStream;
src: string;
begin
  src := Form1.Edit1.Text;
  client := TIdHTTP.Create(Application);
  stream := TMemoryStream.Create;
  client.OnWork:=Status(TObject, TWorkMode, Int64);
  client.Get('http://domain.tld/datei.exe', stream);
  stream.Seek(0, soFromBeginning);
  stream.SaveToFile(src);
  test := 'nur zum testen, ob der thread läuft';
  Synchronize(@ShowStatus);
end;
 
procedure TMyThread.Status(Sender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
end;
 
constructor TMyThread.Create(CreateSuspended: boolean);
begin
  FreeOnTerminate:= True;
  inherited Create(CreateSuspended);
end;
 
initialization
  {$I unit1.lrs}
 
end.
Ich weiß, ist momentan nicht der sauberste Code... ist bis jetzt auch nur zum rumprobieren^^. Mein Problem ist wie bereits gesagt, dass ich die oben genannte Fehlermeldung erhalte. Wenn ich bei client.onwork statt "TObject, TWorkMode, Int64" einfach nur client.onwork := Status; eingebe, erhalte ich die Meldung, dass die Parameteranzahl nicht übereinstimmt. Hat jemand eine Idee, wie man das Problem lösen könnte?

Lazarus: 0.9.26.1 Beta und Indy 10

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: TObject - Indy onwork

Beitrag von theo »

client.OnWork:=@Status;
oder {$mode delphi} statt {$mode objfpc}

useo6
Beiträge: 4
Registriert: Mo 20. Okt 2008, 16:08

Re: TObject - Indy onwork

Beitrag von useo6 »

Super - danke, hat funktioniert :). Jetzt ist nur noch die Frage, wie ich zwischen den Threads unterscheiden kann... also dass bei Thread 1 Label1 angesteuert wird und bei Thread 2 dementsprechend halt Label2.

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: TObject - Indy onwork

Beitrag von theo »

Na irgendwie halt. ;-)
Verpass deiner TMyThread Klasse ein Label Property oder merk dir die Thread ID's oder die Sockets oder.....

Achja und vergiss nicht das Ganze mit Synchronize zu machen...

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: TObject - Indy onwork

Beitrag von Christian »

Würd dir mal ans herz legen von iny wegzudenken das ist gross und buggy. Gibt viele schöne alternativen für Lazarus.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten