需要XCB中的XEventsQueued(显示、队列数据读取)
我正在将CYBOI的一些代码从Xlib迁移到XCB CYBOI为不同的通信通道使用两个线程,如: 串口、终端、插座、x窗口系统。 但是,它仅将这些线程用于信号/事件/数据检测; 实际的接收和发送是在主线程中完成的, 为了避免地址空间的多线程冲突 对于x_window_系统通道,我以前在一个线程中:需要XCB中的XEventsQueued(显示、队列数据读取),c,xlib,xcb,C,Xlib,Xcb,我正在将CYBOI的一些代码从Xlib迁移到XCB CYBOI为不同的通信通道使用两个线程,如: 串口、终端、插座、x窗口系统。 但是,它仅将这些线程用于信号/事件/数据检测; 实际的接收和发送是在主线程中完成的, 为了避免地址空间的多线程冲突 对于x_window_系统通道,我以前在一个线程中: int n = XEventsQueued(display, QueuedAfterReading); 检测到事件后,设置“中断标志”。 之后,主线程使用: 当没有更多的事件可用时,主线程停止接收事
int n = XEventsQueued(display, QueuedAfterReading);
检测到事件后,设置“中断标志”。
之后,主线程使用:
当没有更多的事件可用时,主线程停止接收事件
x_window_系统通道线程开始侦听,XEventsQueued再次出现
现在,我将代码迁移到xc绑定(XCB)。
有一个阻塞函数“xcb_wait_for_event”,用于读取事件。
我错过的是一些功能“向前看”,如果有未决事件,
没有从队列中实际返回/删除事件
我在网上读了几个小时,但找不到这样的功能。
“xcb_poll_for_事件”没有帮助。阻塞对我来说很好,
因为我的事件检测在它自己的线程中运行。
“xcb_请求_检查”作为第三个输入函数似乎不是我想要的
谁能帮帮我吗
谢谢,
Christian您是否正在寻找
xcb\u poll\u for_queued\u event(xcb\u connection\u t*c)
它返回下一个事件而不从连接读取?首先感谢Julien的回复
我研究了XCB1.9源代码,发现
“xcb_poll_for_queued_event”函数不是我需要的
函数“xcb_poll_for_event”和“xcb_poll_for_queued_event”
两者都称为“为下一个事件轮询”。
函数“poll_for_next_event”和“xcb_wait_for_event”
两者都称为“获取事件”
如果“get_事件”发现一个事件,它会更改内部
指向下一个事件的链接列表。不过,我会的
不希望单独更改事件队列
无论事件是否可用
因此,我建议在XCB中添加如下功能:
void* NULL_POINTER = (void*) 0;
int xcb_test_for_event(xcb_connection_t* c) {
int r = 0;
if (c != NULL_POINTER) {
struct _xcb_in in = c->in;
struct event_list* l = in.events;
if (l != NULL_POINTER) {
xcb_generic_event_t* e = l->event;
if (e != NULL_POINTER) {
r = 1;
}
}
}
return r;
}
这将允许我编写一个无休止的循环,如:
while (!xcb_test_for_event(connection)) {
sleep(t);
}
这与旧的Xlib功能相当:
int n = XEventsQueued(d, QueuedAfterReading);
它刚刚检查了事件队列中的事件数。
“XEventsQueued”函数总是立即返回,而不带
如果队列中已有事件,则输入/输出
谢谢
Christian啊,我使用的API文档是:版本为XCB 1.2(相当旧),但现在发现了新版本的XCB 1.9。是的,xcb_poll_for_queued_事件函数听起来很有希望。将在未来几天内试用…是的,您肯定需要将此发送到xcb@lists.freedesktop.org讨论这个!
int n = XEventsQueued(d, QueuedAfterReading);