【问题标题】:WaitForSingleObject freezing applicationWaitForSingleObject 冻结应用程序
【发布时间】:2014-09-29 02:37:59
【问题描述】:

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

但是,它会一直转到开关的默认部分。我做错了什么?

【问题讨论】:

  • 如果您发布您尝试过的代码,您更有可能获得一些帮助。这应该会有所帮助,stackoverflow.com/help/mcve
  • 对不起!我已经通过添加我尝试过的代码来编辑我的帖子!谢谢 :) @IanAuld
  • @winston:您基本上已经编辑了您的问题以提出一个新问题。人们不会注意到这一点——“老”问题已经有了答案。如果您有新问题,请提出问题,但请使用 [link text](URL) 添加指向此问题的链接。
  • @MSalters 好的,可以。谢谢 ! :)

标签: c++ windows kernel driver


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    一种可能的解决方法是生成一个线程并让它执行 Wait...()'s 并选择将 windows 消息发送到主线程,以便常规消息处理接口可以继续与您的“助手”线程。

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

    【讨论】:

    • 无论是 MFC、Qt 还是类似的东西,在 Windows 上你都会有那个消息循环(又名“消息泵”)。
    猜你喜欢
    • 1970-01-01
    • 2019-11-04
    • 2015-05-09
    • 2013-09-26
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    相关资源
    最近更新 更多