Einzelnen Beitrag anzeigen

winx

Registriert seit: 14. Jun 2005
265 Beiträge
 
#1

Von Thread aus auf WinForm zugreifen (und Objekte ändern) ?

  Alt 14. Nov 2006, 11:04
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
  Mit Zitat antworten Zitat