Повторная инвалидация окна в GTK+: сбой после нескольких шагов

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

person Travis Martin    schedule 09.01.2012    source источник
comment
Что, если вы будете считать /без/ использования signal_timeout? Тогда он работает корректно?   -  person Christian Smith    schedule 11.01.2012
comment
@senshikaze Я пробовал много способов выполнить вычисления без использования signal_timeout и обнаружил, что любой метод, который должен работать вечно, ломается после небольшого количества итераций. Например, я пытался (безуспешно) вызвать perform_step внизу 'on_expose_event'.   -  person Travis Martin    schedule 17.01.2012


Ответы (1)


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

person unwind    schedule 15.02.2012