Bonjour,
Je crée un autre post puisque cela n'a plus grand chose à voir avec mon interrogation de la veille 
Je vous explique rapidement ma situation:
Je suis en train de créer un programme multi-thread (librairie pthread) comportant d'un côté ma logique métier, de l'autre mon interface (le cas échéant avec GTK).
Pourquoi créer des threads ? Pour pouvoir exploiter les différents coeurs de mon processeur, mais aussi pour que l'utilisateur puisse tout le temps avoir la main sur l'application, en cas de gros calcul par exemple.
Je communique entre mes threads via des signaux UNIX, pour assurer deux choses:
- Ne pas devoir mettre un thread en attente d'un autre (ce qui aurait été le cas si je les avais synchronisés avec des sémaphores).
- Assurer l'indépendance entre ma logique métier et son mon interface, ce qui me permettra par la suite de pouvoir changer totalement cette dernière sans devoir ne serait-ce qu'ouvrir le code de ma logique métier.
Bref, ça c'était l'architecture de mon application.
J'ai un problème en ce qui concerne la mise à jour de ma grille:
Pour expliquer la situation, l'utilisateur clique sur un bouton, la vue envoie un signal de démarrage à la logique métier. Cette dernière envoie toutes les X secondes un message de mise à jour à ma vue, tant que la vue ne lui a pas envoyé de signal d'arrêt.
Ma grille est déclarée dynamiquement, l'accès en lecture ou en écriture étant gérée par un sémaphore.
Au bout d'un certain nombre de secondes, aléatoire, ma vue ne se met plus à jour et bloque sur l'instruction:
gtk_widget_queue_draw(widgets.plateau);
J'ai déjà vu sur certains sites qu'une mauvaise utilisation des threads pouvait aboutir à ce type de comportement. Cependant je n'utilise pas du tout les threads GTK, mon interface étant dans un thread qui lui est dédié, et je n'en crée pas d'autres. J'ai tenté de débugger pendant plusieurs heures mon programme pour trouver le problème, en vain.
J'ai remarqué que j'avais parfois le même problème lorsque j'initialise ma grille (dans ce cas, il n'y a qu'un aller-retour entre modèle et vue question signaux), à savoir lorsque j'exécute le code suivant:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| /* Destruction du label */
if (widgets.lblInit != NULL) {
gtk_widget_destroy(widgets.lblInit);
widgets.lblInit = NULL;
}
/* Si le plateau a déjà été initialisé, on le détruit */
if (widgets.plateau != NULL) {
gtk_widget_destroy(widgets.plateau);
widgets.plateau = NULL;
}
/* On crée la grille du jeu */
widgets.plateau = gtk_drawing_area_new();
/* Ajout de la grille dans la box verticale */
gtk_box_pack_start(GTK_BOX(widgets.box), widgets.plateau, TRUE, TRUE, 0);
/* A l'affichage, la fonction de dessin doit être appelée */
g_signal_connect(G_OBJECT(widgets.plateau), "expose_event", G_CALLBACK(affichage_grille), NULL);
gtk_widget_show(widgets.plateau); |
De plus, très rarement j'ai ce message:
(<unknown>:3189): Gtk-CRITICAL **: IA__gtk_widget_get_visible: assertion `GTK_IS_WIDGET (widget)' failed
Il n'est pas bloquant mais récurrent, et je n'en trouve pas l'origine.
Merci pour votre lecture, j'espère que vous pourrez m'aider
En attendant, j'essaye de fouiller un peu partout (debug, doc,...).
Partager