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