AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Prozedur mit Parametern an Thread übergeben

Prozedur mit Parametern an Thread übergeben

Ein Thema von bwolf · begonnen am 23. Mär 2011 · letzter Beitrag vom 2. Apr 2014
Antwort Antwort
Seite 1 von 2  1 2   
bwolf

Registriert seit: 17. Jan 2006
368 Beiträge
 
Delphi 2009 Professional
 
#1

Prozedur mit Parametern an Thread übergeben

  Alt 23. Mär 2011, 16:28
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!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Prozedur mit Parametern an Thread übergeben

  Alt 23. Mär 2011, 16:33
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))
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
Ort: Offingen
3.159 Beiträge
 
Delphi XE Professional
 
#3

AW: Prozedur mit Parametern an Thread übergeben

  Alt 23. Mär 2011, 16:34
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;
Armin
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Prozedur mit Parametern an Thread übergeben

  Alt 23. Mär 2011, 16:43
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
bwolf

Registriert seit: 17. Jan 2006
368 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Prozedur mit Parametern an Thread übergeben

  Alt 23. Mär 2011, 16:49
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
Dann werde ich mal etwas über anonyme Funktionen lesen..
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
Ort: Offingen
3.159 Beiträge
 
Delphi XE Professional
 
#6

AW: Prozedur mit Parametern an Thread übergeben

  Alt 23. Mär 2011, 16:54
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.
Armin
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
bwolf

Registriert seit: 17. Jan 2006
368 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Prozedur mit Parametern an Thread übergeben

  Alt 23. Mär 2011, 17:48
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
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
Ort: Offingen
3.159 Beiträge
 
Delphi XE Professional
 
#8

AW: Prozedur mit Parametern an Thread übergeben

  Alt 23. Mär 2011, 17:56
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 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
Armin
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Prozedur mit Parametern an Thread übergeben

  Alt 23. Mär 2011, 19:29
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);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (23. Mär 2011 um 19:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#10

AW: Prozedur mit Parametern an Thread übergeben

  Alt 23. Mär 2011, 19:42
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?
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf