Запуск от потока к основному потоку в цикле событий XCB

Кто-нибудь есть какие-либо идеи о том, как я могу получить мой цикл событий основного потока, который выглядит следующим образом:

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

Чтобы отреагировать на сообщение из вторичного потока?

0

Решение

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-серверу.

Смотрите учебник для дополнительной информации.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]