窗体在_tWinMain中的WaitForSingleObject期间没有响应

VC++: Form not responding during WaitForSingleObject in _tWinMain

本文关键字:响应 WaitForSingleObject tWinMain 中的 窗体      更新时间:2023-10-16

我搜索了论坛,还没能找到答案。我是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等替代方案。

有人能帮帮我吗?非常感谢。

如您所知,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