Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要XCB中的XEventsQueued(显示、队列数据读取)_C_Xlib_Xcb - Fatal编程技术网

需要XCB中的XEventsQueued(显示、队列数据读取)

需要XCB中的XEventsQueued(显示、队列数据读取),c,xlib,xcb,C,Xlib,Xcb,我正在将CYBOI的一些代码从Xlib迁移到XCB CYBOI为不同的通信通道使用两个线程,如: 串口、终端、插座、x窗口系统。 但是,它仅将这些线程用于信号/事件/数据检测; 实际的接收和发送是在主线程中完成的, 为了避免地址空间的多线程冲突 对于x_window_系统通道,我以前在一个线程中: int n = XEventsQueued(display, QueuedAfterReading); 检测到事件后,设置“中断标志”。 之后,主线程使用: 当没有更多的事件可用时,主线程停止接收事

我正在将CYBOI的一些代码从Xlib迁移到XCB

CYBOI为不同的通信通道使用两个线程,如: 串口、终端、插座、x窗口系统。 但是,它仅将这些线程用于信号/事件/数据检测; 实际的接收和发送是在主线程中完成的, 为了避免地址空间的多线程冲突

对于x_window_系统通道,我以前在一个线程中:

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);