从X11队列中删除额外公开消息

时间:2013-09-06 13:55:38

标签: c++ x11 xlib

我有一个程序,其中包含一个使用Expose生成XSendEvent个消息的线程。第二个线程接收Expose消息以及其他消息(主要是输入处理)。问题是发送线程以恒定速率(~60Hz)发送Expose消息,但接收线程可能渲染速度慢于此。 X11队列会因额外的Expose消息而陷入困境,任何输入处理消息都会落后于所有额外的Expose消息。

在Windows中,这不是问题,因为Windows会自动将所有WM_PAINT消息合并为一条消息。有没有办法在X11中执行此操作,或以其他方式解决此问题?

3 个答案:

答案 0 :(得分:3)

您可以与XCheckTypedEvent()和朋友一起轻松地合并任何类型的活动。

答案 1 :(得分:1)

我能够解决这个问题如下:

使用XPeekEvent阻止渲染线程。

当一个事件进入时,使用XPendingXNextEvent的组合将所有事件读入新的队列数据结构,但只复制第一个公开消息。

然后在新队列数据结构上运行事件处理循环。

这解决了我的问题,但我认为使用XCheckTypedEvent(每个应用程序的答案here)的解决方案可能更优雅。

答案 2 :(得分:0)

你可以做的一件事:

  • 如果您正在为每个事件进行完全重绘,则只有计数为0,count>的操作事件1是特定矩形的重绘
  • 如果您为部分窗口生成公开事件,这将减少每个公开事件的工作量
  • 恒定费率,意味着您可以处理每个第n个事件或保留自上次事件以来的时间并忽略在给定时间内收到的事件