Имам таймер, който извиква метод (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