2016-11-08 7 views
0

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

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

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

ответ

1

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.

See the tutorial для получения дополнительной информации.

+0

Спасибо Сэму это очень интересно. Я сделаю это и дам вам знать, как все прошло. Если у вас есть время, вы можете показать «сообщение для себя, через сервер». – Noitidart

+0

Есть ли существующее событие, которое я могу использовать с 'xcb_send_event', мне просто нужно отправить строку. Как возможно, 'XCB_EVENT_MASK_NO_EVENT'? – Noitidart

+1

Вы можете использовать событие 'ClientMessage'. Для получения дополнительной информации см. [Спецификация протокола X11R7] (https://www.x.org/releases/X11R7.7/doc/xproto/x11protocol.html#events:ClientMessage). –