Guten Tag,
ich habe ein einfaches WinForm Formular, welches LEDs ethält. Diese LEDs haben die Property value (boolean) mit deren Hilfe
ich sie an- und ausschalten kann.
Nun möchte ich aus einem eigenen Thread auf die LEDs zugreifen und sie SICHER an- und ausschalten.
Mache das mit einem Delegaten und einem Invoke auf die LED
Delphi-Quellcode:
unit LaserStateWatcherThread;
interface
uses
MainForm,
LaserState,
System.Drawing,
System.Windows.Forms,
Remotefunctions,
System.Threading,
Led;
type
updateDelegate =
procedure(led:TLed; value : boolean)
of object;
TLaserStateWatcherThread =
class
private
m_MainForm : TMainForm;
m_WatcherThread : Thread;
m_ThreadRunning:boolean;
procedure running();
procedure safeUpdate(led:TLed; value : boolean);
//procedure safeUpdate();
public
constructor Create(form : TMainForm);
procedure start();
procedure stop();
end;
implementation
constructor TLaserStateWatcherThread.Create(form : TMainForm);
begin
inherited Create();
m_MainForm := form;
m_WatcherThread := Thread.Create(running);
end;
procedure TLaserStateWatcherThread.running;
unsafe;
var
helpDelegate : updateDelegate;
begin
helpDelegate := &Self.safeUpdate;
while (m_ThreadRunning)
do begin
try
//Wo liegt mein Fehler in dieser Zeile:
m_MainForm.LEDLaserConnected.Invoke(System.Delegate(@helpDelegate(m_MainForm.LEDLaserConnected,false)));
//Compiler meldet:
//[Pascal Warnung] LaserStateWatcherThread.pas(67): W1047 Unsicherer Code '@-Operator'
//[Pascal Fehler] LaserStateWatcherThread.pas(67): E2036 Variable erforderlich
//So war es vorher:
//m_MainForm.LEDLaserConnected.value:= false;
end;
Thread.Sleep(1000);
end;
end;
procedure TLaserStateWatcherThread.safeUpdate(led:TLed; value : boolean);
begin
led.Value := value;
end;
procedure TLaserStateWatcherThread.start;
begin
self.m_WatcherThread.Start();
m_ThreadRunning := true;
end;
procedure TLaserStateWatcherThread.stop;
begin
m_ThreadRunning := false;
m_WatcherThread.Abort;
end;
end.
Bin mir im Moment nich schlüssig, wie diese Zeilen auszusehen haben...und was sie bewirken:
Delphi-Quellcode:
//Sollte stimmen:
helpDelegate := &Self.safeUpdate;
//compilerfehler (wie oben beschrieben):
m_MainForm.LEDLaserConnected.Invoke(System.Delegate(@helpDelegate(m_MainForm.LEDLaserConnected,false)));
wenn ich die 2.Zeile abändere,
m_MainForm.Invoke(System.Delegate(@helpDelegate));
compiliert der Compiler zwar, aber dann weiss meine Funktion ja nie, auf welche
LED sie zugreifen soll...
Kann mir jemand helfen?
gruß und danke,
winx