2016-10-03 1 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 в бесконечном цикле, он неоднократно читает это событие, не справляется с этим, и поэтому программа блокируется.

Смежные вопросы