Interfacer une application console avec Gtk+
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 :aie:.
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:
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:
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:
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:
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:
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 ?