WaitForSingleObject冻结应用程序

我有一个内核驱动程序检测进程创build,与应用程序来显示结果。 我正在使用WaitForSingleObject(event, INFINITE)来检测进程创build。

它在控制台应用程序中运行良好,但是当我将它添加到GUI应用程序时,整个应用程序都冻结了。 我怀疑这是由于WaitForSingleObject ,和一些谷歌search后,我尝试使用MsgWaitForMultipleObjects但它没有工作。

编辑:我正在使用C ++ Windows窗体应用程序

我不得不继续等待,因为我正在进行“永远”的监控,而不仅仅是一次性的活动。

我可以提供代码或更多的信息,如果你需要,将感谢任何forms的帮助,谢谢!

我在我的C ++ winform应用程序的头文件中完成了以下操作:

*注意myEvent = ::OpenEventW(....);

 while (true) { switch (::MsgWaitForMultipleObjects( 1, &myEvent, FALSE, INFINITE, QS_ALLINPUT) ) { case WAIT_OBJECT_0: { //do my stuff (send IOCTL to driver and stuff) } case (WAIT_OBJECT_0 + 1): { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } break; } } } 

但是,它一直持续到交换机的默认部分。 我究竟做错了什么?

MsgWaitForMultipleObjects绝对有效,但你必须了解它是如何工作的。 它将返回事件或到达的消息。 而这些信息是防止您的应用程序冻结所需的。 但是你必须处理这个消息:

 GetMessage(&msg, 0, 0, 0); TranslateMessage(&msg); DispatchMessage(&msg); 

假设这是C ++和MFC GUI应用程序,内部代码中有一个循环,用于检索消息,并将调用变为您在C ++主代码中处理窗口消息(相当于GetMessage())的函数。 DispatchMessage()在一个C的Windows程序)。 如果线程执行Wait …(),则该循环停止。

一个可能的解决办法是产生一个线程,并让它执行Wait …(),并可选地将窗口消息发送到主线程,以便常规的消息处理接口可以继续与你的“助手”线。

我不确定细节,但是这里的某个人可能会帮忙,或者也许是作为MSDN论坛或MSDN文章。