WaitForSingleObject冻结应用

WaitForSingleObject freezing application

本文关键字:应用 冻结 WaitForSingleObject      更新时间:2023-10-16

我有一个内核驱动程序检测进程创建,并使用一个应用程序显示结果。我使用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;
        }
    }
}

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

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

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

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

一种可能的工作是生成一个线程,让它执行Wait…(),并有选择地向主线程发送windows消息,以便常规的消息处理接口可以继续与你的"助手"线程一起使用。

我不确定细节,但这里的人可能能够帮助,或者可能作为msdn论坛或msdn文章。