AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Prism Von Thread aus auf WinForm zugreifen (und Objekte ändern) ?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Offene Frage von "winx"
Ein Thema von winx · begonnen am 14. Nov 2006 · letzter Beitrag vom 14. Nov 2006
Antwort Antwort
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
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#2

Re: Von Thread aus auf WinForm zugreifen (und Objekte ändern

  Alt 14. Nov 2006, 11:10
Es gibt von Control.Invoke eine überladene Version, die auch die Argumente für den Delegaten übernimmt.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
winx

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

Re: Von Thread aus auf WinForm zugreifen (und Objekte ändern

  Alt 14. Nov 2006, 11:16
Danke, und wie müsste ich diese dann aufrufen???

würde es so passen:

Delphi-Quellcode:
helpDelegate := &Self.safeUpdate;
changeLEDState(m_MainForm.LEDLaserConnected,false,helpDelegate);

...
procedure TLaserStateWatcherThread.changeLEDState(led: TNWLed; value: boolean;helpDelegate:updateDelegate);
var args : ArrayList;
begin
  args := ArrayList.Create();
  args.Clear;
  args.Add(led);
  args.Add(TObject(value));
  led.Invoke(System.Delegate(@helpDelegate),args.ToArray);
end;
???

danke
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#4

Re: Von Thread aus auf WinForm zugreifen (und Objekte ändern

  Alt 14. Nov 2006, 11:30
Wie genau das in Delphi aussehen muss, weiß ich nicht. Insbesondere die Warnung "Unsicherer Code" macht mich da stutzig, aber ich habe auch kein Delphi.NET zum Nachgucken.
In C# muss grundsätzlich der Delegat instanziiert werden. Also prinzipiell eine Variable vom Typ des Delegaten (und nicht der Methode), die initialisiert wird mit einem Methodenzeiger. Und diese Variable übergibt man an Invoke. Du castest lediglich den Methodenzeiger in einen Delegaten.
Ich weiß aber nicht, wie Delphi das genau handhabt.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:31 Uhr.
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