3
次のコードは、この問題を最小限に示しています。バックグラウンドスレッドでは、有効なハンドル配列を作成し、それをWaitForMultipleObjects
に渡すと、オブジェクトが正常に待機します。WaitForMultipleObjectsが動作し、MsgWaitForMultipleObjectsが失敗します - なぜですか?
ただし、同じ配列をMsgWaitForMultipleObjects
に渡すと、ERROR_INVALID_HANDLE
で関数呼び出しが失敗します(WAIT_FAILED
)。
私は間違っていますか?
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows, SyncObjs, Classes;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
procedure TMyThread.Execute;
var
LEvent : TEvent;
LWaitHandles : TWOHandleArray;
LPWaitHandles : PWOHandleArray;
LWaitResult : Cardinal;
begin
LEvent := TEvent.Create;
LWaitHandles[0] := LEvent.Handle;
LPWaitHandles := @LWaitHandles;
while not Terminated do begin
{Works -> LWaitResult := WaitForMultipleObjects(1, LPWaitHandles, false, INFINITE);}
{Fails ->} LWaitResult := MsgWaitForMultipleObjects(1, LPWaitHandles, false, INFINITE, QS_ALLINPUT);
case LWaitResult of
WAIT_OBJECT_0: WriteLn('Event 1 Signaled');
{ etc... }
WAIT_FAILED : WriteLn(SysErrorMessage(GetLastError));
end;
end;
end;
var
lt : TMyThread;
begin
lt := TMyThread.Create(false);
ReadLn;
end.
は、スレッドは、メッセージキューを持っていない問題ですか?特定の関数を呼び出すときにのみ取得されます。 PeekMessage、GetMessageなどのように。完全なリストを覚えることはできません。 –
@DavidHeffernanいいえ、私はそれを理解しました - それはRTLの問題です(WinAPIラッパーの不安定型の一貫性)。スレッドに投稿されたメッセージがなくても、 'MsgWaitForMultipleObjects'は' WAIT_FAILED'を返しません。 –
ああ私はそれを覚えています。 RTLラッパーは色あせています。また、そのような64要素を持つ配列を宣言するポイントはありません。あなたはTWOHandleArrayを決して宣言しません。 –