Windows Vista でマルチスレッド シミュレーションを実行しています。PostThreadMessage を使用してスレッド間でメッセージを送信すると、すべてのスレッドから PeekMessage を呼び出すため、スレッド ID が有効であり、スレッドにメッセージ キューがあることを (デバッガーをステップ実行して) 確信しているにもかかわらず、ERROR_INVALID_THREAD_ID を取得しています。 MSDNで指定されているように、それらを作成した後。ターゲット スレッドが中断されている可能性がありますが、私が知る限り、それは問題ではありません。
何を試すかについての手がかりはありますか?私は RTOS ベースのアプリケーションをシミュレートしているので、Windows 固有のコードをあまり追加する必要がないように願っています。
編集 -
別の手がかり - すべてのセマフォ ブロッキングを削除すると、メッセージは正常に機能します (ただし、既知の競合状態がいくつかあります)。しかし、メッセージ キューはスレッド ブロックの影響を受けるべきではありませんよね?
編集2 MSDNで提案されているように、コードには次の再試行メカニズムもあります。しかし、それでもうまくいきません - 再試行は常に失敗します。うーん.....
BOOL bResult = false;
int retry = 0;
DWORD dwError = 0;
do
{
bResult = PostThreadMessage(pTaskHandle->dwThreadID,0,0,(LPARAM)pMessage);
if (!bResult)
{
dwError = GetLastError();
retry++; // should only happen once, if the dest thread has no msg queue
// the retry establishes the queue
Sleep(500);
}
} while (!bResult && retry<3); // MSDN says try this a few times to start msg queue