我目前正在使用win32 GUI应用程序中的CreateProcess/WaitForSingleObject来启动一个处理软件许可问题的小型GUI应用程序.这一切都很好,但它在等待许可应用程序完成其工作时基本上挂起了"父"应用程序.在此期间,不会发生对父应用程序的更新,如果移动实用程序应用程序窗口,则会以丑陋的白色方块结束.
此外,由于某些奇怪的原因,当实用程序应用程序正在运行时,如果我将该应用程序中的内容复制到剪贴板,它会挂起.我还没弄清楚原因,但只有在等待应用程序在父应用程序内完成时才会发生.
所以我想如果我可以让父应用程序在等待我的其他应用程序完成时处理它的事件,它可能会解决这两个问题.
那么,是否还有可以处理UI更新的CreateProcess/WaitForSingleObject的替代品?
您的父进程似乎挂起,因为WaitForSingleObject()调用阻塞了您的线程,直到您传递给调用的句柄发出信号.
您的子进程可能在复制到剪贴板操作期间挂起,因为作为该操作的一部分,它会专门向父进程窗口或所有顶级窗口发送消息.父进程的线程中的消息循环未运行,因为它等待子进程退出时被阻塞,因此永远不会处理该消息并且子进程仍然被阻止.
您可以调用MsgWaitForMultipleObjects()而不是调用WaitForSingleObject ().如果为dwWaitMask参数指定QS_ALLINPUT,则MsgWaitForMultipleObjects将在您的事件发出信号或者线程的消息队列中有输入时返回.如果由于消息可用而返回MsgWaitForMultipleObjects(),则可以处理它并继续等待:
MSG msg; DWORD reason = WAIT_TIMEOUT; while (WAIT_OBJECT_0 != reason) { reason = MsgWaitForMultipleObjects(1, &hChildProcess, FALSE, INFINITE, QS_ALLINPUT); switch (reason) { case WAIT_OBJECT_0: // Your child process is finished. break; case (WAIT_OBJECT_0 + 1): // A message is available in the message queue. if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); // Note that if your main message loop does additional processing // (such as calling IsDialogMessage() for modeless dialogs) // you will want to do those things here, too. } break; } }