Windows 了解MsgWaitForMultipleObjects

Windows 了解MsgWaitForMultipleObjects,windows,multithreading,Windows,Multithreading,我有一个主gui线程,我希望在后台线程执行某些任务时,对用户的操作保持响应,例如移动对话框、调整大小等。在过去,我使用带超时的WaitForSingleObject来处理gui事件,同时等待后台线程完成。我最近读到了关于MsgWaitForMultipleObjects的文章,它似乎解决了我有点干净的问题 有人能告诉我下面代码中的bug吗&我哪里出错了?当我单击按钮启动线程时,gui没有响应。我制作了一个对话框应用程序,其中有一个avi正在主ui线程上播放。我有一个启动线程的按钮,使用MsgWa

我有一个主gui线程,我希望在后台线程执行某些任务时,对用户的操作保持响应,例如移动对话框、调整大小等。在过去,我使用带超时的WaitForSingleObject来处理gui事件,同时等待后台线程完成。我最近读到了关于MsgWaitForMultipleObjects的文章,它似乎解决了我有点干净的问题

有人能告诉我下面代码中的bug吗&我哪里出错了?当我单击按钮启动线程时,gui没有响应。我制作了一个对话框应用程序,其中有一个avi正在主ui线程上播放。我有一个启动线程的按钮,使用MsgWaitForMultipleObjects等待线程句柄,但允许在线程完成/发出信号时处理所有消息

谢谢

UINT MyThreadProc( LPVOID pParam )
{
    ThreadData* pObject = (ThreadData*)pParam;

    if (pObject == NULL ||
        !pObject->IsKindOf(RUNTIME_CLASS(ThreadData)))
    return 1;   

    // Do some processing.
    int x = 0; 
    while (x++ < 5000)
    {
        for (int i=0; i<50000; i++)
            double sum = sqrt((double)i+1) * sqrt((double)i+2); 
    }

    return 0;
}

如果您没有处理UI线程的传入消息,请使用(另请参阅)作为示例

  while (true) {
    switch (MsgWaitForMultipleObjects(1, &h,
                         FALSE, INFINITE, QS_ALLINPUT)) {
    case WAIT_OBJECT_0:
      DoSomethingWith(h); // event has been signalled
      break;
    case WAIT_OBJECT_0+1:
      // we have a message - peek and dispatch it
      while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
        // TODO:  must handle WM_QUIT; see Raymond's blog for details
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
      break;
    default:
      return FALSE; // unexpected failure
    }
  }

是的,就是这样。谢谢。这是雷蒙德写的错误代码。你需要在peekmessage上循环。5次投票,样本中有一些危险的bug。。。修正(不冒犯原作者)。windows运行时中不再定义WAIT_OBJECT_1,因此我将其更改为WAIT_OBJECT_0+1
  while (true) {
    switch (MsgWaitForMultipleObjects(1, &h,
                         FALSE, INFINITE, QS_ALLINPUT)) {
    case WAIT_OBJECT_0:
      DoSomethingWith(h); // event has been signalled
      break;
    case WAIT_OBJECT_0+1:
      // we have a message - peek and dispatch it
      while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
        // TODO:  must handle WM_QUIT; see Raymond's blog for details
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
      break;
    default:
      return FALSE; // unexpected failure
    }
  }