【问题标题】:Wait for a window message for a defined time在定义的时间内等待窗口消息
【发布时间】:2011-05-13 22:57:33
【问题描述】:

我正在用 winapi 编程。如何在定义的时间内等待消息? 如果没有消息,我可以做另一个任务。我不能使用睡眠,因为窗口回调过程会被延迟。

while (true){
    ...//wait a message for 30 miliseconds
    GetMessage(&message, hwnd, 0, 0) ) or PeekMessage(&message, hwnd, 0, 0, PM_REMOVE)
    ...
    if ( no_message ){
        call_a_function();
    } else {
        if (finish)
            break;
        TranslateMessage(&message);
        DispatchMessage(&message);
        ...//set to wait 30 minus elapsed time 
    }
}

【问题讨论】:

    标签: windows winapi loops timer window


    【解决方案1】:

    这正是MsgWaitForMultipleObjects 的用途。

    【讨论】:

    • 此函数不等待窗口事​​件。
    • 是的。请参阅 dwWaitMask 参数以了解它可以唤醒的事件类型。
    • 此函数失败,GetLastError() 返回 ERROR_INVALID_HANDLE。我试过 MsgWaitForMultipleObjects(1, (HANDLE*)&hwnd, true, 30, QS_ALLEVENTS); MsgWaitForMultipleObjects(1, &current_thread, true, 30, QS_ALLEVENTS );
    • 您尝试的两件事不是有效的 HANDLE 值。 (HWND 不是 HANDLE,也不是指向变量的指针。)如果您不想等待句柄(例如事件或其他东西),请为前三个 args 传递零、NULL、FALSE:例如MsgWaitForMultipleObjects(0, NULL, FALSE, 30, QS_ALLEVENTS)
    【解决方案2】:

    您可以使用timer

    This site 还展示了如何使用 win32 计时器。

    【讨论】:

      【解决方案3】:

      这似乎是一个奇怪的要求。 Windows 程序应该是响应式的。如果 call_a_function 花费大量时间,那么您的应用将获得“此 Windows 没有响应”处理。

      此外,如果队列中没有发布消息,GetMessage 将进入等待状态。我不明白为什么您的消息循环看起来与 canonical message loop 如此不同。

      我认为要很好地回答这个问题,了解你的 call_a_function 例程的目的会很有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-26
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 2011-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多