1

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

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

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

4

2 回答 2

3

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

这会导致应用程序不响应绘画或用户输入消息,因为我发布的消息始终具有优先权。

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

因此,我不会在主窗体上发布消息,而是设置一个计时器。

定时器消息的优先级低于

  • 其他发布的消息
  • WM_PAINT 消息
于 2016-02-13T17:27:33.610 回答
1

对于WM_PAINT窗口代码,DefWndProc只需设置一个标志,然后仅在下次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。您不需要使用这种方法的自定义消息。

于 2009-11-25T16:34:13.617 回答