У меня есть таймер, который вызывает метод (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) {
...
}
signal_timeout
? Тогда он работает корректно? - person Christian Smith   schedule 11.01.2012signal_timeout
и обнаружил, что любой метод, который должен работать вечно, ломается после небольшого количества итераций. Например, я пытался (безуспешно) вызватьperform_step
внизу 'on_expose_event'. - person Travis Martin   schedule 17.01.2012