Autor Beitrag
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 20.02.09 22:13 
Ereignisorientierte Threads/Message Handling
Threads werden normalerweise nicht ereignisorientiert betrieben. Das heisst, man leitet von TThread ab und schreibt sequentiellen Code in die abgeleitete Execute-Methode. Folgende Low-Level-Klasse TMessageThread stellt eine Alternative zu TThread dar: Statt der Execute-Methode müssen hier message-Methoden geschrieben werden. Entweder in einer abgeleiteten Klasse von TMessageThread oder in einer fremden Klasse (in diesem Fall entfällt das Ableiten). Die Message-Methoden können dann über PostMessage im Kontext des Threads ausgelöst werden. Wenn keine Messages verschickt werden schläft der Thread.

Anwendungsbereich: z.B. als Basis für die Realisierung eines Worker-Threads, der getrennt von der GUI arbeitet und Instruktionen vom GUI-Mainthread erhält.

Anwendungsbeispiel (Beispiel mit SendMessage zur Veranschaulichung):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
{$APPTYPE CONSOLE}

uses Windows, Messages, SysUtils, MessageThread;

const
  UM_GETID = WM_USER + 1;

type
  TMyThread = class(TMessageThread)
  protected
    procedure UMGetID(var Message: TMessage); message UM_GETID;
  end;

procedure TMyThread.UMGetID(var Message: TMessage);
begin
  Message.Result := GetCurrentThreadId;
end;

var
  Thread: TMyThread;
begin
  Thread := TMyThread.Create;
  try
    Writeln('MainThreadID: '+IntToStr(GetCurrentThreadId));
    Writeln('ThreadID: '+IntToStr(SendMessage(Thread.Handle, UM_GETID, 00)));
  finally
    Thread.Free;
  end;
  readln;
end.

Natürlich hätte man das Messaging alleine auch ohne Windows-Messages realisieren können. Hier geht es jedoch um eine Implementation einer minimalen Windows-Message-Schleife in einem Thread. So kann bspw. relativ einfach ein Windows-Timer im Thread betrieben werden.


MessageThread.pas  (4.37 KB) Download (Rev 0)
 (740x, 740x gesamt)
Beschreibung: MessageThread.pas

Für diesen Beitrag haben gedankt: Narses