Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi In Thread auf Event warten (https://www.delphipraxis.net/144628-thread-auf-event-warten.html)

Björn Ole 12. Dez 2009 15:10


In Thread auf Event warten
 
Servus,

ich machs kurz: In einer DLL wird ein Thread erstellt, in dem ich wiederum ein Object erstelle, auf dessen Ereignisse ich reagieren möchte.
Ansonsten hat der Thread keine weiteren Aufgaben, ich möchte praktisch nur ressourcenschonend auf Ereignisse warten.
Basteleien mit WaitForSingleObject in Verbindung mit CreateEvent und SetEvent haben ins Leere geführt.

Wie macht man das richtig?


Delphi-Quellcode:
library MyObjProject;

uses
  Classes;

{$R *.res}

type
  TMyThread = class(TThread)
  private
    Obj: TMyObj;
    procedure OnSomeEvent;
  protected
    procedure Execute; override;
  end;

{ TMyThread }

procedure TMyThread.Execute;
begin
  Obj := TObject.Create;
  {jetzt arbeitet das Object}
  {Eventhandler zuweisen}
  Obj.OnSomeEvent := OnSomeEvent;
  {hier jetzt auf Events warten... nur wie?}
end;

procedure TMyThread.OnSomeEvent;
begin
  {...}
end;

begin
  TMyThread.Create(false);
end.
Danke schonmal.
Björn

sirius 12. Dez 2009 16:13

Re: In Thread auf Event warten
 
Das hängt von deinem Objekt ab. Was macht es denn?

Björn Ole 12. Dez 2009 16:34

Re: In Thread auf Event warten
 
Es empfängt WM_DEVICECHANGE Nachrichten und löst ein Event bei USB Geräteanschluss/-entfernung aus (ähnlich diesem Code).

sirius 12. Dez 2009 17:30

Re: In Thread auf Event warten
 
Dann baust du eine Messageschleife:
Delphi-Quellcode:
while getmessage(msg,0,0,0) do //msg von Typ TMsg
  dispatchmessage(msg);
Achte darauf, dass du die Methode Terminate redefinierst und darin Postthreadmessage mit WM_Quit sendest.

Björn Ole 12. Dez 2009 21:41

Re: In Thread auf Event warten
 
Danke, die Nachrichtenschleife läuft!
Meinst du das mit PostThreadMessage so in etwa?

Delphi-Quellcode:
type
  TMyThread = class(TThread)
  {...} 
  protected
    procedure Terminate;
  end;

{ TMyThread }

{...}

procedure TMyThread.Terminate;
begin
  PostThreadMessage(Self.ThreadID, WM_QUIT, 0, 0);
  inherited Terminate;
end;
Und warum braucht man das? Warum die Schleife nicht so:

Delphi-Quellcode:
while (not Terminated) and GetMessage(Msg, 0, 0, 0) do
  DispatchMessage(Msg);

sirius 12. Dez 2009 22:43

Re: In Thread auf Event warten
 
Ja, so meine ich das. Und das braucht man, weil GetMessage blockierend ist und nur zurückkommt, wenn eine asynchrone Message gesendet wurde. Nun kann man naürlich nach einem terminate warten, bis irgendeine Komponente in dem Thread diese bekommt oder man erzwingt sie, damit alles recht flott geht.

Björn Ole 12. Dez 2009 23:04

Re: In Thread auf Event warten
 
Super, danke für Deine Hilfe! :thumb:


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