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):
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, 0, 0))); 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.