Повтарящо се анулиране на прозорец в 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