PostMessage优先?

时间:2009-11-25 16:19:15

标签: winapi priority-queue postmessage

是否可以优先处理使用PostMessage(或任何其他相关方法)发送的邮件?

例如,只有当队列中没有其他消息时,才会处理WM_PAINT消息。是否可以使用自定义消息实现类似的行为?

如果我使用带有特殊参数的WM_PAINT来向窗口传递自定义消息(我控制WndProc)它会有类似的行为吗?

2 个答案:

答案 0 :(得分:2)

我想要一个后台线程来通知主要结果可以显示给用户。但是,如果您只是将消息发布到主线程,它将立即得到处理。

这会导致应用程序无法响应绘制或用户输入消息,因为我发布的消息始终优先。

我使用的技巧是WM_TIMER消息的优先级低于WM_PAINT消息。

因此,我不会在主表单上发布消息,而是设置计时器。

定时器消息的优先级低于

  • 其他发布消息
  • WM_PAINT消息

答案 1 :(得分:1)

对于WM_PAINTDefWndProc中的窗口代码只设置一个标志,然后只有在下次调用GetMessage时队列为空时才检查该标志。某些鼠标消息也会合并(较旧的消息会在较新的消息到达时删除)。

真正的答案取决于你实际想要实现的行为。

如果你试图避免重入,只需检查一个快速退出的标志,如:

////bool processing = false; // class/window instance variable
...
void HandleCustomMessage()
{
    ////if (processing)
    ////{
    ////    return;
    ////}

    ////processing = true;
    DoSomething();
    ////processing = false;
}

如果您想要一个实际的优先级队列,那么有许多PQ实现。将数据项添加到PQ,然后发布自定义消息(始终使用相同的ID)。然后,自定义消息处理程序向PQ请求最高优先级项。

<小时/> 另一种选择是截取GetMessage循环,使用对PeekMessage的调用来查看是否有任何操作,如果有消息则调用GetMessage,否则请检查您的PQ。使用此方法不需要自定义消息。