0

フォーラムを検索しましたが、答えが見つかりませんでした。VC++ でフォームをプログラミングするのは初めてです。私が持っているものはとてもシンプルです。次のように、フォームを表示して、そのフォームからのイベントを待ちたいとします。

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, 
In_opt_ HINSTANCE hPrevInstance, 
_In_ LPTSTR CmdLine,
_In_ int nCmdShow)

{

    bool bExit = FALSE;
    Main oForm;

    g_UIThread.g_hUIEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    g_MainLineThread.g_MainLineEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    oForm.Show();

    while (!bExit) {
        WaitForSingleObject(&g_UIThread.g_hUIEvent, INFINITE);

          (etc)

問題は、中にある間にフォームがハングすることWaitForSingleObjectです。私はMsgWaitForMultipleObjects解決策がないような代替案を見てきました。

誰か助けてくれませんか?とても感謝しています。

4

1 に答える 1

1

ご存じのとおり、WaitForSingleObject は単一のイベントを待機しています。そのため、ウィンドウ メッセージは処理されません。

while (!bExit) {
  if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
      // dispatch the message
  } else if (WaitForSingleObject(&g_UIThread.g_hUIEvent, 0) == WAIT_OBJECT_0) {
      // handle the event
  }
}

ウィンドウ メッセージに WaitForMultipleObjects を使用する場合は、イベントが通知されていることを確認するために QS_ALLINPUT を使用する必要があります。(PeekMessage の前に以下を呼び出す必要があることに注意してください)

MsgWaitForMultipleObjects(0, NULL, FALSE, timeout, QS_ALLINPUT) == WAIT_OBJECT_0
于 2013-06-19T02:28:14.387 に答える