У меня есть таймер, который вызывает метод (perform_step
) каждую секунду.perform_step
делает некоторые вычисления и делает недействительным мое окно.Сначала это работает хорошо, но после небольшого количества итераций on_expose_event окна не запускается.После отладки я обнаружил, что был вызван метод аннулирования окна, но обработчик событий не введен.
Есть идеи, что может вызвать это?Вот некоторые вещи, которые я обнаружил, которые могут быть полезны:
- Когда вычисления в
perform_step
короче, вещи ломаются после меньшего количества итераций. - Вещи ломаются послеодинаковое количество итераций каждый раз.
- Перемещение мыши по окну предотвращает разрушение.Если я постоянно наведу курсор мыши на окно, все будет работать вечно.Кажется, "сбросить" счетчик.Если что-то сломается после 10 итераций, а на 9-й итерации я наведу курсор мыши на окно, а затем все сломается на 19-й итерации.
Вот фрагмент кода:
bool SimDisplay::on_button_press_event(GdkEventButton* event) {
Glib::signal_timeout().connect( sigc::mem_fun(*this, &SimDisplay::perform_step), 1000 );
}
bool SimDisplay::perform_step() {
world->step();
//on the last iteration this is called but on_expose_event is never reached
get_window()->invalidate(true);
}
bool SimDisplay::on_expose_event(GdkEventExpose* event) {
...
}