WaitForSingleObject冻结应用程序

时间:2014-08-06 08:33:11

标签: c++ windows kernel driver

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

它在控制台应用程序中运行良好,但当我将其添加到GUI应用程序时,整个应用程序冻结了。我怀疑这是由WaitForSingleObject引起的,经过一些谷歌搜索,我尝试使用MsgWaitForMultipleObjects,但它没有用完。

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

我必须继续等待,因为我正在监视"永远"而不只是一次性活动..

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

我在我的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;
        }
    }
}

但是,它会继续进入交换机的默认部分。我做错了什么?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

一个可能的解决方法是生成一个线程并让它执行Wait ...()并选择性地将Windows消息发送到主线程,这样常规的消息处理接口可以继续用于你的“帮手”线程。

我不确定细节,但是这里的某些人可能会提供帮助,或者可能是msdn论坛或msdn文章。