在XCB事件循环中从线程触发到主线程

Trigger from thread to main thread in XCB Event Loop

本文关键字:线程 XCB 事件 循环      更新时间:2023-10-16

有没有人对我如何得到我的主线程事件循环有任何想法,看起来像:

const int MY_CUST_MSG(877);
xcb_generic_event_t *event;
    while (event = xcb_wait_for_event(connection)) {
        switch (event->response_type & ~0x80) {
            case MY_CUST_MSG:
                    // do something
                break;
            default:
                // Unknown event type, ignore it
                debug_log("Unknown event: ", event->response_type);
        }
        free(event);
    }

响应来自次级线程的消息?

xcb_wait_for_event()等待从服务器接收事件。您必须通过服务器向自己发送消息,但我建议使用另一种方法:

  1. 使用xcb_file_descriptor()获取X连接的底层文件描述符

  2. 设置一个内部管道,你的应用程序可以使用它在线程之间发送消息给自己。

  3. 使用xcb_poll_for_event() (xcb_wait_for_event()的非阻塞版本)来实现非阻塞检查是否有事件已被读取,如果有,则读取它

  4. 在内部管道上执行非阻塞读取,以检查来自其他线程的任何内部消息

  5. 如果步骤3和步骤4都没有产生消息,使用poll()等待其中一个事件

您还需要使用xcb_flush()手动刷新任何事件,并使用xcb_connection_has_error()检查到X服务器的致命连接错误。