首页 > 解决方案 > 在 epoll_pwait、POSIX 计时器和 X11 事件上。大多数 X11 事件要么延迟要么丢弃

问题描述

设置如下。

have a X11 connection file descriptor x11_fd set in non-blocking mode.
have a signal file descriptor sig_fd         set in non-blocking mode.
create a POSIX timer with timer_create

add all above in epoll set

main_loop:
 n = epoll_pwait(ep_fd, ep_evs, MAXEVENTS, -1, &mask_sigs)
  if(fd == sig_fd)
   do set some signal flags
  if(fd == x11_fd)
   do X11 events
  if(fd == timer_fd or timeout)
   do some small computations
end_main_loop

X11 事件被处理while((event = xcb_poll_for_event(...)))

4 second计时器设置为按速率到期。并且所有X11事件都按顺序交付,没有被删除。现在,如果计时器设置为亚秒级,X11 事件会延迟或完全丢弃。

问题是,应用程序可能需要一个高速率的定时器。

我天真的想法是在处理定时器生成的回调时epoll将事件排队。似乎没有时间什么的。老实说,我不知道为什么事件被丢弃了。我只想克服它。最好有一些多路复用并且没有线程。X11POSIXepollCPUX11

更新

我删除了计时器并将epoll_pwait超时设置为最小值。问题仍然存在。我必须注意,事件并没有被丢弃,而是被排队并批量接收。此外,延迟的事件并不是我听过的所有事件。鼠标移动,焦点,离开/进入显示没有延迟。此外,该应用程序在某种程度上表现得非常奇怪,即当我移动鼠标、移动窗口或进行其他交互时(我不知道它是什么样的交互),键盘以更高的速率被拉动。

在这里需要一些帮助。可以将带有一些脚本的代码发布到github.

更新

好吧,经过一番思考,我认为与X11必须以恒定速率运行的计算任务的交互并不能很好地集成到多路复用范式中。适用于所有计算的epoll_wait计算似乎改变了另一种多路复用任务的时间频率。

更新

更改了伪代码以反映我在事件循环中进行了一些小计算。

注意

定时器事件频率高于X11事件频率。X 服务器事件介于计时器事件之间并搞砸了处理。

标签: clinuxsignalsepollxcb

解决方案


推荐阅读