2013-09-06 3 views
1

У меня есть программа, которая имеет поток, который генерирует Expose сообщений с использованием XSendEvent. Второй поток принимает сообщения Expose вместе с другими сообщениями (главным образом, с обработкой ввода). Проблема заключается в том, что отправляющий поток отправляет сообщения Expose с постоянной скоростью (~ 60 Гц), но поток приема может быть медленнее, чем этот. Очередь X11 будет увязнуть с дополнительными сообщениями Expose, и любые сообщения обработки ввода начнут отставать от всех этих дополнительных сообщений Expose.Удалить дополнительные сообщения Expose из X11 Queue

В Windows это не проблема, поскольку Windows автоматически объединяет все сообщения WM_PAINT в одно сообщение. Есть ли способ сделать это в X11 или каким-то другим способом решить эту проблему?

ответ

3

Вы можете очень легко объединить любые мероприятия самостоятельно с помощью XCheckTypedEvent() и друзей.

0

Некоторые вещей вы можете сделать:

  • Если вы делаете полную перерисовку для каждого события, только действия события с отсчетом 0, число> 1 является перерисовкой определенного прямоугольника в
  • Если вы создаете события экспонирования для части окна, это уменьшит объем работы, каждый из которых выставляет событие
  • Постоянная ставка означает, что вы можете обрабатывать каждое n-е событие или сохранять время с момента последнего события и игнорировать события, полученные в течение в данное время
1

Я был в состоянии решить эту проблему следующим образом:

Блок рендеринга нить с помощью XPeekEvent.

Когда событие приходит, прочитайте все события в новой структуре данных очереди, используя комбинацию из XPending и XNextEvent, но скопируйте только первое сообщение об открытии.

Затем запустите цикл обработки событий над новой структурой данных очереди.

Это устранило проблему для меня, но я думаю, что решение, которое использует XCheckTypedEvent (на вопрос n.m. here), вероятно, более изящно.