4 votes

Invalidation répétée des fenêtres dans GTK+ : échec après plusieurs étapes

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) {
  ...
}

1voto

unwind Points 181987

Votre on_button_press_event() Il manque un return Assurez-vous que tous vos gestionnaires renvoient la bonne chose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X