Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Prozedur mit Parametern an Thread übergeben (https://www.delphipraxis.net/159338-prozedur-mit-parametern-thread-uebergeben.html)

bwolf 23. Mär 2011 16:28

Prozedur mit Parametern an Thread übergeben
 
Hallo,

ich habe einen Thread, dem ich eine Prozedur übergeben möchte, die dann in diesem Thread ausgeführt wird.
Das sieht bis jetzt so aus:

Code:
type
  TReportThread = Class(TThread)
  public
    Proc : Procedure of object;
  protected
    procedure Execute; override;
  end;

procedure TReportThread.Execute;
begin
  try
    Proc;
  except
    // Error handling
  end;
end;

Den Thread starte ich folgendermaßen:
Code:
procedure TService1.AdsEvent1Notification(Sender: TObject; event: string;
  count: Integer; eventdata: string);
var
  reportThread : TReportThread;
begin
  reportThread := TReportThread.Create(True);
  reportThread.Proc := dmReports.printPersonalList;
  reportThread.Resume;
end;

// Hier ist die Prozedur die vom Thread ausgeführt werden soll
procedure TdmReports.printStart();
begin
  // Code
end;

Soweit klappt das auch alles.
Nun würde ich gerne der Prozedur die dem Thread übergeben wird einen Parameter mitgeben.
Ich habe schon einiges versucht, aber bin leider im gescheitert.
Wäre nett wenn mir da einer weiter helfen könnte...
Vielen Dank!

SirThornberry 23. Mär 2011 16:33

AW: Prozedur mit Parametern an Thread übergeben
 
einfach der Procedure mitgeben geht nicht. denn letzendlich gibst du nur die Adresse der Procedure mit. Die Parameter musst du entsprechend ebenso an den Thread übergeben wie die Procedure selbst (also mehrere Properties (bzw. einen Record der alle Werte enthält))

s.h.a.r.k 23. Mär 2011 16:34

AW: Prozedur mit Parametern an Thread übergeben
 
Delphi-Quellcode:
TReportThread = class(TThread)
public type
  TThreadedProc: procedure(const AInt: Integer; const AStr: String) of object;
private
  FParam1 : Integer;
  FParam2 : String;
  FProc : TThreadedProc;
protected
  procedure Execute(); override;
public
  property Param1 : Integer read FParam1 write FParam1;
  property Param2 : String read FParam2 write FParam2;
  property Proc : TThreadedProc read FProc write FProc;
end;

procedure TReportThread.Execute();
begin
  try
    Proc(FParam1, FParam2);
  except
  end;
end;

himitsu 23. Mär 2011 16:43

AW: Prozedur mit Parametern an Thread übergeben
 
Welche Delphiversion nutzt du? (das kann man nicht umsonst im Profil angeben)

Mit anonymen Methoden kann man, in neueren Delphis, diesbezüglich nette Spielchen betreiben.

bwolf 23. Mär 2011 16:49

AW: Prozedur mit Parametern an Thread übergeben
 
Hi,
danke für die Antworten!

@ s.h.a.r.k
Sehe ich das richtig das ich bei diesem Weg dann die Parameter der zu übergebenden Funktionen entfernen muß und stattdessen die privaten Variablen des Thread nutze?

@ himitsu
2009...habe mal mein Profil editiert :wink:
Dann werde ich mal etwas über anonyme Funktionen lesen..

s.h.a.r.k 23. Mär 2011 16:54

AW: Prozedur mit Parametern an Thread übergeben
 
Nein, die Parameter bleiben definitiv vorhanden, schau dir doch mal den Typen an, den ich da deklariert habe. Allerdings musst du den Umweg über die Properties gehen, das ist das was SirThornberry schon gesagt hat.

bwolf 23. Mär 2011 17:48

AW: Prozedur mit Parametern an Thread übergeben
 
Hi shark,

irgendwas passt da bei mir nocht nicht.
Der Code sieht jetzt folgendermaßen aus:

Code:
...
type
  TThreadedProc = procedure(const AFileName : String) of object;

type
  TReportThread = Class(TThread)
  private
    FParam1 : String;
    FProc : TThreadedProc;
  protected
    procedure Execute(); override;
  public
    property Param1 : String read FParam1 write FParam1;
    property Proc : TThreadedProc read FProc write FProc;
  end;
...
Aber beim zuweisen der Funktion erhalte ich einen Fehler:
Code:
...
  reportThread := TReportThread.Create(True);
  reportThread.Proc := dmReports.printPersonalList(sRequestId);
  reportThread.Resume;
...
Fehler: Inkompatible Typen: 'string' und 'procedure, untyped pointer or untyped parameter'

Für einen Tipp wäre ich nochmals dankbar

s.h.a.r.k 23. Mär 2011 17:56

AW: Prozedur mit Parametern an Thread übergeben
 
Delphi-Quellcode:
...
  reportThread := TReportThread.Create(True);
  reportThread.Proc := dmReports.printPersonalList;
  reportThread.Param1 := 'Ein Wert ;)';
  reportThread.Resume;
...
Du musst die Property setzen, so wie ich gerade gezeigt habe. Du setzt mit
Delphi-Quellcode:
reportThread.Proc := ...
ja nur den Pointer auf die Methode. An der Stelle hat das nichts mit den Parametern zu tun. Schau dir vielleicht mal Events genauer an, das ist ja auch nichts anderes -- vor allem, wenn du dynamisch Events definierst.

PS: Du solltest noch eine Getter- und Setter-Methode einführen, die das Lesen und Schreiben via CriticalSections absichert. Sonst kannst du unter Umständen Probleme bekommen.

PPS: Es gibt auch [delphi] Tags ;)

himitsu 23. Mär 2011 19:29

AW: Prozedur mit Parametern an Thread übergeben
 
http://www.delphipraxis.net/158203-s...rgumenten.html

Delphi-Quellcode:
type
  TSimpleThread = class(TThread)
  private
    FProc: TThreadProcedure;
  protected
    procedure Execute; override;
  public
    class procedure CreateThread(Proc: TThreadProcedure);
  end;

procedure TSimpleThread.Execute;
begin
  FProc;
end;

class procedure TSimpleThread.CreateThread(Proc: TThreadProcedure);
var
  Thread: TSimpleThread;
begin
  Thread := TSimpleThread.Create(True);
  Thread.FProc := Proc;
  Thread.FreeOnTerminate := True;
  Thread.Start;
end;



var
  TheParam, TheParam2: String;
begin
  TheParam := 'der Text';
  TheParam2 := 'Caption';
  TSimpleThread.CreateThread(procedure
    begin
      // von hier ...
      MessageBox(0, PChar(TheParam), PChar(TheParam2), 0);
      // bis hier wird alles im Thread ausgeführt ^^
    end);

Aphton 23. Mär 2011 19:42

AW: Prozedur mit Parametern an Thread übergeben
 
Zitat:

Zitat von bwolf
Delphi-Quellcode:
...
  reportThread.Param1 := sRequestId;
  reportThread.Proc := dmReports.printPersonalList;
...

Edit: Wtf? Ich kann keine verbesserte Zitate posten, weil mein Beitrag dann kürzer ist als 3 Zeichen. Ist das so gewollt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:58 Uhr.
Seite 1 von 2  1 2      

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