2013-04-02 15 views
2

我正在將一些代碼從Xlib遷移到XCB。需要XEB中的XEventsQueued(顯示,QueuedAfterReading)

CYBO關於如何使用不同的通信通道,如: serial_port,terminal,socket,x_window_system。但是,它僅將這些線程用於信號/事件/數據檢測; 實際的收發是在主線程中完成的, 爲了避免任何地址空間的多線程衝突。

對於X_WINDOW_SYSTEM信道,我先前detected events在一個線程:

int n = XEventsQueued(display, QueuedAfterReading); 

在檢測到事件時,一個「中斷標誌」被設置。 之後,主線程是reading the actual event使用:

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)返回的下一個事件,而不從連接讀?

+0

啊,我用的API文檔:這是版本1.2 XCB(很舊)的http://xcb.freedesktop.org/manual/index.html,但現在新發現XCB 1.9的。是的,xcb_poll_for_queued_event函數聽起來很有前途。將在接下來的幾天內試用...... –

1

首先,感謝Julien的回覆。

我研究了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」發現一個事件,它會將內部的 鏈接列表更改爲指向下一個事件。不過,我想 寧願不改變事件隊列AT ALL,獨立 從事件是否可用。

因此,我建議增加一項功能類似下面的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」函數總是立即返回,但不會輸入/輸出 。

感謝 基督教

+0

是的,你一定要把這個發送到[email protected]來討論這個! –