Hallo zusammen,
und zwar streite ich mich immer noch mit meinen Threads. Ich habe im Moment einen LogController, der von verschiedenen Threads aus bedient werden kann, d.h. die Log()-Methode steht für diese zur Verfügung. In der Log-Methode wird eine Queue gefüllt und via PostThreadMessage eine Nachricht an den Haupt-Thread geschickt.
Beim Erzeugen des LogControllers (was im HauptThread geschieht -> explizites synchronisiertes Erzeugen) wird ein globaler Hook registriert:
Delphi-Quellcode:
const
WM_LOG_NOTIFIER = WM_USER + 123;
////////////////////////////////////////////////////////////////////////////////////////////////////
////
//
//
constructor TLogController.Create();
var
Method: TMethod;
begin
inherited Create();
{ ... }
// FHookMethodPointer and FHookHandle are private variables
Method.Code := @TLogController.HookProc;
Method.Data := Self;
FHookMethodPointer := MakeProcInstance(Method);
FHookHandle := SetWindowsHookEx(WH_GETMESSAGE, FHookMethodPointer, 0, System.MainThreadID);
end;
////////////////////////////////////////////////////////////////////////////////////////////////////
////
//
//
function TLogController.HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LResult; stdcall;
var
P: PMsg;
begin
case nCode < HC_ACTION of
True:
Result := CallNextHookEx(FHookHandle, nCode, wParam, lParam);
else
if (lParam <> 0) then
begin
P := PMsg(lParam);
if (P^.message = WM_LOG_NOTIFIER) then
Self.DoPropagateLog();
end;
Result := CallNextHookEx(FHookHandle, nCode, wParam, lParam);
end;
end;
Nun ist es so, dass dieser Hook nicht wirklich auf die Nachricht reagiert, die via PostThreadMessage() versendet wird. Hier noch der Aufruf:
PostThreadMessage(System.MainThreadID, WM_LOG_NOTIFIER, 0, 0);
Ich sehe nicht wirklich, warum der Hook nicht auf diese Nachricht reagieren sollte
Wobei ich sagen muss, dass ich nicht weiß, ob
PMsg der richtige Typ für lParam ist. Ich habe bisher noch nichts passenderes gefunden.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)