Потребность в XEventsQueued(display, QueuedAfterReading) в XCB

Я перенесу некоторый код CYBOI из Xlib в XCB.

CYBOI использует несколько потоков для разных каналов связи, таких как: serial_port, терминал, сокет, x_window_system. Однако он использует эти потоки только для обнаружения сигнала / события / данных; фактический прием и отправка выполняются в основном потоке, чтобы избежать любых многопоточных конфликтов адресного пространства.

Для канала x_window_system я ранее обнаружил события в потоке:

int n = XEventsQueued(display, QueuedAfterReading);

При обнаружении события был установлен "флаг прерывания". После этого основной поток считывал фактическое событие, используя:

XNextEvent(display, &event);

Когда больше событий не было доступно, основной поток прекратил получать события, и поток канала x_window_system снова начал слушать XEventsQueued.

Теперь я переносю код в X C Binding (XCB). Существует блокирующая функция "xcb_wait_for_event", которая отлично подходит для чтения события. Что я пропускаю, так это какую-то функцию "заглядывать вперед", если есть ожидающие события, БЕЗ фактического возврата / удаления события из очереди.

Я пару часов читал в интернете, но не смог найти такую ​​функцию. "Xcb_poll_for_event" не помогает. Блокировка - это хорошо для меня, так как мое обнаружение событий выполняется в своем собственном потоке. "Xcb_request_check" в качестве третьей функции ввода, кажется, не то, что я хочу.

Может ли кто-нибудь помочь мне?

Спасибо христианин

2 ответа

Решение

Вы ищете xcb_poll_for_queued_event(xcb_connection_t *c) который возвращает следующее событие без чтения из соединения?

Во-первых, спасибо Жюльену за его ответ.

Я изучил источники 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" всегда немедленно возвращает БЕЗ ввода / вывода, если в очереди уже есть события.

Спасибо христианин

Другие вопросы по тегам