Bonjour.

Une fois n'est pas coutume je viens vers vous vous exposer un problème. Cela fait plus d'une semaine que je m'y casse les dents .

Je suis en train de reprendre mon interface linechec qui est une IHM pour gnuchess. La dernière modification que j'ai apporté à cette application date de 2009 ! Il était donc temps de la dépoussiérer .

Après un passage par la case GTK+ v3... et une interface géré par Glade je remets en service le code d'appel de gnuchess ainsi que le code de communication. Et là, c'est la cata ! Pour faire simple tout le texte envoyé sur stdout par gnuchess n'est pas récupéré pour mon interface.

Pour que vous puissiez peut-être m'apporter une solution voila quelques lignes de code. Pour lancer gnuchess je lance ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
g_spawn_async_with_pipes(NULL, argv, NULL, G_SPAWN_SEARCH_PATH|G_SPAWN_LEAVE_DESCRIPTORS_OPEN, NULL, NULL, &child_pid, &entree, &sortie, &standard_error, &error);
Aucune erreur n'est générée par cette commande. Je déclare dans la foulée les pointeurs giochannel pour chaque canal :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
MainWindow->channel_write = g_io_channel_unix_new (entree);
MainWindow->channel_read = g_io_channel_unix_new (sortie);
MainWindow->channel_error = g_io_channel_unix_new (standard_error);
Puis j'attache chaque canal au callback associé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
g_io_add_watch ((GIOChannel *) MainWindow->channel_read, G_IO_IN|G_IO_PRI, (GIOFunc) readsocket, MainWindow);
g_io_add_watch ((GIOChannel *) MainWindow->channel_error, G_IO_IN, (GIOFunc) readsocket_error, MainWindow);
Une fois toute cette initialisation je suis prêt "à discuter" avec gnuchess. Je lance ma première commande :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
MainWindow->commande = g_strdup ("protover 2");  // Détruit dans writesocket
g_io_add_watch ((GIOChannel *) MainWindow->channel_write, G_IO_OUT, (GIOFunc) writesocket, MainWindow);
gnuchess recoit correctement la commande et me répond. Tout le texte est ici correctement reçu. Voila le callback associé au stdout :
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
21
22
23
gboolean readsocket (GIOChannel * giochan, GIOCondition *giocond, GMainWindow *MainWindow)
{
  GString *buffer = g_string_new (NULL);
  GError *error=NULL;
 
  g_io_channel_read_line_string (giochan, buffer, NULL, &error);
  if (error)
    {
      insertion_texte_fen_etat_connexion (MainWindow, error->message);
      g_error_free (error);
 
      g_string_free (buffer, TRUE);
 
      return TRUE;
    }
 
  // Affichage dans le fenêtre console de la communication gnuchess
  lecture_gnuchess_coup (MainWindow, buffer->str);
 
  g_string_free (buffer, TRUE);
 
   return TRUE;
}
Le hic est que dés que je lui envoie une nouvelle commande, gnuchess la recoit, l'exécute correctement mais sa réponse n'est pas totalement reçu par l'interface et la fonction g_io_channel_read_line_string(); dans le callback readsocket(); est bloquante !

Avez-vous une idée sur la question ?