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:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
 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:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
(<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,...).