![]() |
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! |
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))
|
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; |
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. |
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.. |
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.
|
AW: Prozedur mit Parametern an Thread übergeben
Hi shark,
irgendwas passt da bei mir nocht nicht. Der Code sieht jetzt folgendermaßen aus:
Code:
Aber beim zuweisen der Funktion erhalte ich einen Fehler:
...
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; ...
Code:
Fehler: Inkompatible Typen: 'string' und 'procedure, untyped pointer or untyped parameter'
...
reportThread := TReportThread.Create(True); reportThread.Proc := dmReports.printPersonalList(sRequestId); reportThread.Resume; ... Für einen Tipp wäre ich nochmals dankbar |
AW: Prozedur mit Parametern an Thread übergeben
Delphi-Quellcode:
Du musst die Property setzen, so wie ich gerade gezeigt habe. Du setzt mit
...
reportThread := TReportThread.Create(True); reportThread.Proc := dmReports.printPersonalList; reportThread.Param1 := 'Ein Wert ;)'; reportThread.Resume; ...
Delphi-Quellcode:
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.
reportThread.Proc := ...
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 ;) |
AW: Prozedur mit Parametern an Thread übergeben
![]()
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); |
AW: Prozedur mit Parametern an Thread übergeben
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 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 by Thomas Breitkreuz