Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Wie eine Prozedur mit Parametern per Syncronize() aufrufen? (https://www.delphipraxis.net/129653-wie-eine-prozedur-mit-parametern-per-syncronize-aufrufen.html)

BlueStarHH 23. Feb 2009 12:19


Wie eine Prozedur mit Parametern per Syncronize() aufrufen?
 
Hallo alle zusamen!

Ich habe mir folgende Thread-Klasse erstellt:

Delphi-Quellcode:
TSendMailsProgress = procedure(Sender: TObject; MailNr, MailsLeft: Integer; TimeRunning, TimeLeft: TTime) of object;

TMailSendThread = class(TThread)
private
  FOnSendMailsProgress: TSendMailsProgress;
public
  procedure Execute; override;

  property OnSendMailsProgress: TSendMailsProgress read FOnSendMailsProgress write FOnSendMailsProgress;
end;

procedure TMailSendThread.Execute;
var
  MailNr, MailsLeft: Integer;
  TimeRunning, TimeLeft: TTime;
begin

  while not Terminated do
  begin
    //Hier passiert auch noch was. Gelöscht, damit es übersichtlicher ist.
    //Z.B. werden MailNr, MailsLeft, TimeRunning, TimeLeft hier gefüllt.

    if Assigned(FOnSendMailsProgress) then
      FOnSendMailsProgress(Self, MailNr, MailsLeft, TimeRunning, TimeLeft);
  end;

end;
Ich möchte nun die Methode OnSendMailsProgress über Synchronize aufrufen, da dort Interkationen mit der VCL/GUI stattfinden. Wie kann ich dies tun? Ich habe es wie folgt probiert:


Delphi-Quellcode:
procedure TMailSendThread.Execute;
var
  MailNr, MailsLeft: Integer;
  TimeRunning, TimeLeft: TTime;

  procedure DoSendMailsProgress;
  begin
    if Assigned(FOnSendMailsProgress) then
      FOnSendMailsProgress(Self, MailNr, MailsLeft, TimeRunning, TimeLeft);
  end;

begin

  while not Terminated do
  begin
    //Hier passiert auch noch was. Gelöscht, damit es übersichtlicher ist.
    //Z.B. werden MailNr, MailsLeft, TimeRunning, TimeLeft hier gefüllt.

    Syncronize(DoSendMailsProgress); //<-- FEHLER !!!!!
  end;

end;
Dort wird der Fehler "Inkompatible Typen: Methodenzeiger und reguläre Prozedur" angezeigt. Ersetze ich die Zeile mit dem Fehler durch

Delphi-Quellcode:
Synchronize(@DoSendMailsProgress); // @-Zeichen beachten
erscheint der Fehler "Inkompatible Typen: TThreadMethod und Pointer".

Wer hat eine Lösung? Danke!

Apollonius 23. Feb 2009 12:32

Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
 
Packe DoSendMailsProgress als Methode in die Klasse und speichere MailNr, MailsLeft, TimeRunning und TimeLeft als Felder.

BlueStarHH 23. Feb 2009 12:44

Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
 
Zitat:

Zitat von Apollonius
Packe DoSendMailsProgress als Methode in die Klasse und speichere MailNr, MailsLeft, TimeRunning und TimeLeft als Felder.

Gibt es keine andere Möglichkeit? Ich habe noch 7 andere Events mit zusammen 24 Parametern. Das wird doch dann irgenwie unübersichtlich und ist auch nicht mehr schönes OOP.

DeddyH 23. Feb 2009 12:45

Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
 
Du brauchst ja eine Methode und diese ist nunmal Teil einer Klasse.

himitsu 23. Feb 2009 12:47

Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
 
Das ist eigentlich das Standardvorgehen bei solchen Problemen.

Du kannst dir ja die zusammengehörigen Felder/DoIrgendwasProzeduren in der Threaddefinition übersichtlich gruppieren.

Apollonius 23. Feb 2009 12:48

Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
 
Anonyme Methoden sind doch etwas feines...

DeddyH 23. Feb 2009 12:49

Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
 
Zitat:

Zitat von Apollonius
Anonyme Methoden sind doch etwas feines...

In Delphi 5?

himitsu 23. Feb 2009 12:51

Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
 
Delphi-Quellcode:
type TMailSendThread = Class(TThread)
  ....
  private
    FSendMailsProgress: record
      OnSendMailsProgress: TSendMailsProgress;
      MailNr, MailsLeft: Integer;
      TimeRunning, TimeLeft: TTime;
    end;
    procedure DoSendMailsProgress
  end;

procedure TMailSendThread.DoSendMailsProgress;
begin
  with FSendMailsProgress do
    if Assigned(OnSendMailsProgress) then
      FOnSendMailsProgress(Self, MailNr, MailsLeft, TimeRunning, TimeLeft);
end;

BlueStarHH 23. Feb 2009 12:56

Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
 
Zitat:

Zitat von Apollonius
Anonyme Methoden sind doch etwas feines...

Wie würde man es damit machen? Demnächst muss das Delphi 5 hier mal durch 2009 ausgewechselt werden ;-)

Apollonius 23. Feb 2009 13:04

Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
 
Allen Bauer erklärt das hier ganz gut. In der Kurzfassung:
Delphi-Quellcode:
Synchronize(procedure
begin
  if Assigned(FOnSendMailsProgress) then
    FOnSendMailsProgress(Self, MailNr, MailsLeft, TimeRunning, TimeLeft);
end);
Das kannst du dann direkt in die Execute-Methode schreiben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:42 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