J'ai une minuterie qui appelle une méthode ( perform_step
) toutes les secondes. perform_step
fait des calculs et invalide ma fenêtre. Cela fonctionne bien au départ, mais après un petit nombre d'itérations, l'événement on_expose_event de la fenêtre n'est pas déclenché. En déboguant, j'ai découvert que la méthode d'invalidation de la fenêtre avait été appelée, mais que le gestionnaire d'événement n'était pas entré.
Une idée de ce qui pourrait causer cela ? Voici quelques éléments que j'ai découverts et qui pourraient être utiles :
- Lorsque le calcul en
perform_step
est plus courte, les choses tombent en panne après moins d'itérations. - Les choses tombent en panne après le même nombre d'itérations à chaque fois.
- En déplaçant la souris sur la fenêtre, on évite que les choses se dégradent. Si je déplace constamment la souris sur la fenêtre, les choses vont s'éterniser. Il semble que cela "réinitialise" le compteur. Si les choses s'arrêtent après 10 itérations et qu'à la 9ème itération je déplace la souris sur la fenêtre, les choses s'arrêtent à la 19ème itération.
Voici un extrait de code :
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) {
...
}