Повторная аннулирование окна в GTK +: ошибка после нескольких шагов - PullRequest
4 голосов
/ 10 января 2012

У меня есть таймер, который вызывает метод (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) {
  ...
}

1 Ответ

1 голос
/ 15 февраля 2012

В вашем on_button_press_event() отсутствует оператор return; убедитесь, что все ваши обработчики возвращают правильную вещь.

...