2

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

CYBOI 使用几个线程用于不同的通信通道,例如:serial_port、terminal、socket、x_window_system。但是,它仅将这些线程用于信号/事件/数据检测;实际的接收和发送在主线程中完成,以避免地址空间的任何多线程冲突。

对于 x_window_system 通道,我之前在线程中检测到事件:

int n = XEventsQueued(display, QueuedAfterReading);

检测到事件后,设置了“中断标志”。之后,主线程正在使用以下命令读取实际事件

XNextEvent(display, &event);

当没有更多事件可用时,主线程停止接收事件,x_window_system 通道线程再次开始使用 XEventsQueued 进行侦听。

现在,我将代码迁移到 XC Binding (XCB)。有一个阻塞函数“xcb_wait_for_event”,可以很好地读取事件。如果有未决的事件,我想念的是一些“向前看”的功能,而实际上没有从队列中返回/删除事件。

我现在在网上阅读了几个小时,但找不到这样的功能。“xcb_poll_for_event”没有帮助。阻塞对我来说很好,因为我的事件检测在它自己的线程中运行。作为第三个输入函数的“xcb_request_check”似乎不是我想要的。

有人可以帮帮我吗?

谢谢,克里斯蒂安

4

2 回答 2

2

您是否正在寻找xcb_poll_for_queued_event(xcb_connection_t *c)哪个返回下一个事件而不读取连接?

于 2013-04-04T21:10:50.627 回答
1

首先,感谢 Julien 的回复。

我研究了 XCB 1.9 的源代码,发现“xcb_poll_for_queued_event”函数不是我需要的。

函数“xcb_poll_for_event”和“xcb_poll_for_queued_event”都调用“poll_for_next_event”。函数“poll_for_next_event”和“xcb_wait_for_event”都调用“get_event”。

如果“get_event”找到一个事件,它会改变内部链表指向下一个事件。但是,我宁愿不更改事件队列,这与事件是否可用无关。

因此,我建议在 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”函数总是立即返回,没有输入/输出。

谢谢克里斯蒂安

于 2013-04-05T13:06:41.327 回答