Я работаю над библиотекой, которая создает прозрачные окна X и использует cairo для их рисования.В основном потоке реализован цикл обработки событий, а операции рисования выполняются в отдельном потоке внутри цикла.Последний выглядит так:
while (self->_running) {
PyGILState_Release(gstate);
usleep(1000); // Sleep 1 ms
gstate = PyGILState_Ensure();
if (self->_expiry <= gettime()) {
draw(self, args_tuple); // All the cairo code is in here
self->_expiry += interval;
interval = self->interval;
}
}
Цикл обработки событий периодически вызывает XNextEvent, чтобы перехватывать только нажатия клавиш / кнопок.Окно отображается до того, как новый поток пользовательского интерфейса запускается из основного потока.
Когда интервал между итерациями в потоке пользовательского интерфейса (значение self->inteval
выше) большой (порядок секунд), окно остаетсяПрозрачный на первой итерации цикла, и он рисуется только со второй итерации.Вызов draw
прямо перед циклом while
не помогает, если между вызовами draw
не происходит пауза в несколько миллисекунд.Например, если я поставлю interval = 25
прямо перед циклом while
, то второй вызов draw
раскроет окно в большинстве выполнений приложения, реализующего этот код.
То, что я пробовал:
cairo_surface_flush
и XFlush
сразу после draw
, похоже, не работает - Отправка
Expose
события не 'Кажется, это тоже не помогает.
Как я могу убедиться, что мой цикл начинает рисовать в окне с первой итерации?