2016-10-03 41 views
0

我有一個具有以下基本結構的程序:XPeekEvent功能被阻斷

while(true) 
{ 
    if(event.type==EVENT_KEY_RELEASE || event.type==EVENT_KEY_PRESS){ 
    XEvent xev;  
    XPeekEvent(display, &xev); 
     if (XFilterEvent(&xev, G.win)) { printf("XFilterEvent: true\r\n"); } 
     else 
     { 
      if(xev.type == KeyRelease || xev.type == KeyPress) 
       // Get keyboard character 
     } 

}

我遇到的問題是,當我按下並釋放鍵盤的鍵,它會阻止事件隊列中,直到我按另一個鍵(或任何其他事件,如鼠標移動和...),理想情況下,我想有一個X功能,檢查事件,但根本不阻止?

UPDATE: 我改變了我的程序,並刪除infimit循環,而不是我試圖做到這一點的計時器胎面和我把這部分每30毫秒,但我仍然有問題。

+0

當你調用'XPeekEvent'時,是什麼讓你確定事件隊列不是空的?如果*爲*空,那麼'XPeekEvent'將會阻塞,直到一個事件變爲可用。 –

+0

如果你想要一個非阻塞的「在隊列中是否有y類型的事件」函數,請參考'XCheckTypedEvent'。然而,我在你提供的有限代碼中看到,你似乎在與* X作鬥爭而不是*使用它(意思是你應該重新考慮你的方法並告訴我們你真正想做什麼) – tofro

回答

0

XPeekEvent在事件中窺視,而不會將其從隊列中移除。因此,如果隊列前端有一些奇怪的事件描述,並且您在無限循環中調用XPeekEvent,它會反覆讀取該事件,無法處理它,並且程序會鎖定。