2013-06-28 2 views
1

У меня есть программа, которая имеет следующую основную структуру:XPending Функция блокирует

while(true) 
{ 
    // get any X11 events 
    while(XPending(display) > 0) 
    { 
     // get an event using XNextEvent and do stuff with it 
    } 

    // draw to the display 
} 

Программа рендеринга OpenGL сцены. Проблема, с которой я сталкиваюсь, заключается в том, что когда я нажимаю и начинаю перетаскивать окно, вызов XPending вызывает блокировки до тех пор, пока я не закончу последовательность перетаскивания, таким образом остановив любую анимацию, которая была в процессе. Я могу решить это решение, добавив еще один поток Expose событий и, таким образом, пробуждая вызов XPending, но в идеале я хотел бы иметь функцию X, которая проверяет события, но не блокирует вообще.

ответ

2

Если вы хотите обработать полученные события без блокировки, чтобы подождать еще, используйте XEventsQueued(display, QueuedAlready) вместо XPending(display).

+2

Спасибо. Оказывается, моя проблема состояла в том, что мой код «рисовать на дисплей» находился внутри цикла «XPending» while вместо внешнего, как показано выше. Перемещение его за пределы цикла заставляет все работать правильно, поэтому кажется, что «XPending» на самом деле не блокировалось, как я думал. – pauld

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

  • Нет связанных вопросов^_^