c - 在 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
将事件排队。似乎没有时间什么的。老实说,我不知道为什么事件被丢弃了。我只想克服它。最好有一些多路复用并且没有线程。X11
POSIX
epoll
CPU
X11
更新
我删除了计时器并将epoll_pwait
超时设置为最小值。问题仍然存在。我必须注意,事件并没有被丢弃,而是被排队并批量接收。此外,延迟的事件并不是我听过的所有事件。鼠标移动,焦点,离开/进入显示没有延迟。此外,该应用程序在某种程度上表现得非常奇怪,即当我移动鼠标、移动窗口或进行其他交互时(我不知道它是什么样的交互),键盘以更高的速率被拉动。
在这里需要一些帮助。可以将带有一些脚本的代码发布到github
.
更新
好吧,经过一番思考,我认为与X11
必须以恒定速率运行的计算任务的交互并不能很好地集成到多路复用范式中。适用于所有计算的epoll_wait
计算似乎改变了另一种多路复用任务的时间频率。
更新
更改了伪代码以反映我在事件循环中进行了一些小计算。
注意
定时器事件频率高于X11
事件频率。X 服务器事件介于计时器事件之间并搞砸了处理。
解决方案
推荐阅读
- swift - PropertyWrapper - 全局是外部的,但没有外部或弱链接
- regex - 如何使用纯“正则表达式”删除字符串的开头
- powershell - 在 powershell 中创建 htpasswd SHA1 密码
- arduino - 如何使用 Processing Game Control Plus 使用 PS4 控制器控制多个舵机
- python - 对 MySQLDB 的 Python 响应 JSON 返回为空
- database - 数据库设计:研究相关项目的多个表与单个表
- google-cloud-platform - 为什么我的“gcloud beta run services replace”命令失败?
- laravel - 使用 Heroku 部署 Laravel 站点时出现错误 500
- c - 使用 getchar 打印数字
- wpf - 带有复选框等子菜单的 WPF ContextMenu