![]() |
Wie eine Prozedur mit Parametern per Syncronize() aufrufen?
Hallo alle zusamen!
Ich habe mir folgende Thread-Klasse erstellt:
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
Dort wird der Fehler "Inkompatible Typen: Methodenzeiger und reguläre Prozedur" angezeigt. Ersetze ich die Zeile mit dem Fehler durch
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;
Delphi-Quellcode:
erscheint der Fehler "Inkompatible Typen: TThreadMethod und Pointer".
Synchronize(@DoSendMailsProgress); // @-Zeichen beachten
Wer hat eine Lösung? Danke! |
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.
|
Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
Zitat:
|
Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
Du brauchst ja eine Methode und diese ist nunmal Teil einer Klasse.
|
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. |
Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
Anonyme Methoden sind doch etwas feines...
|
Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
Zitat:
|
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; |
Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
Zitat:
|
Re: Wie eine Prozedur mit Parametern per Syncronize() aufruf
Allen Bauer erklärt das
![]()
Delphi-Quellcode:
Das kannst du dann direkt in die Execute-Methode schreiben.
Synchronize(procedure
begin if Assigned(FOnSendMailsProgress) then FOnSendMailsProgress(Self, MailNr, MailsLeft, TimeRunning, TimeLeft); end); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:25 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-2025 by Thomas Breitkreuz