Du musst den kompletten Messagequeue nach einem Signal leeren, ansonsten könnte es vorkommen das die eine Message die du mit Peekmessage entfernst eine neue Message postet. In diesem Moment muß MsgWaitForSingleObject() immer wieder sofort zurückkehren, da ja eine Message im Queue ist.
Delphi-Quellcode:
procedure Test;
var
Msg: TMsg;
begin
WriteLn('Start');
while True do
case MsgWaitForMultipleObjects(0, PDWord(nil)^, False, 100, QS_ALLEVENTS) of
WAIT_OBJECT_0:
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
// while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
case Msg.Message of
WM_QUIT: WriteLn('Quit');
else
begin
WriteLn('Message');
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
WAIT_FAILED: WriteLn('Failed');
WAIT_TIMEOUT: WriteLn('Timeout');
end;
WriteLn('End');
end;
Obiger code funktioniert bei mir. Stimmt, mit dem Threadhandle als Event gibt er WAIT_FAILED zurück. Damit ist mein vorletztes Posting falsch.
Bei mir gibt obiger Source in meiner Console aus:
Start
Message
Message
Timeout
Timeout
Message -> bewegte Mousecursor
Timeout
Timeout
Timeout
Message -> Idle message wm_Timer
usw. usw.
Wenn der Timeout zu groß ist dann kann dieser nicht mehr eintreten da in normalen Applications das
OS weakup Messages versendet, zB. wm_SysTimer.
Gruß Hagen