-
Glib IoChannel timeout
Bonjour,
J'utilise des IOChannel pour une connexion par socket entre deux programmes. La connexion marche bien, j'envoie et je reçois.
J'ai un besoin maintenant de timeout, à savoir:
A envoie un message à B,
et attends la réponse de B ou jusqu'à ce que le timeout soit passé.
Comme il n'y a pas de timeout dans le read des iochannel (enfin je crois pas), au départ je comptais, dans A:
1/ Me connecter au signal_io
2/ Ecrire à B dans le channel
3/ Me mettre en attente active tant que le booléen RECEIVED soit faux
ou que mon timer.elapsed() soit < à TIMEOUT (variable)
=> dans cette attente active, dormir un poil de centième de seconde, dépiler les signaux Glib avec MainContext::Iteration
et dans la callback du signal_io, mettre RECEIVED à vrai dès que je reçois le message.
Le problème, c'est que je ne reçois rien dans ce cas, il semble que mon dépilage d'iteration ne fonctionne pas...
y a-t-il une solution plus simple, ou un correctif à mon idée ?
Merci :)
-
Bonjour,
tu peux utiliser g_io_add_watch pour ajouter ta source d'événements à la boucle principale. Voici une méthode pour résoudre ton problème:
Quand A envoie son message, tu amorces une source d'événement timeout avec ton temps maximum autorisé pour la réponse grâce à g_timeout_add. Cette fonction retourne un identifiant de source d'événements.
Quand ta callback de réception de données est appelée, et que tes données ont bien été reçues, tu supprimes la source timeout avec g_source_remove.
Bien sûr, pense à gérer une file d'attente de message à envoyer pour éviter l'entrelacement de messages (deuxième message envoyés par A alors qu'on est encore en attente de la réponse de B).
-
hm, merci pour cette réponse, la solution est jolie :)
Je vais aller voir du coté de ce io_add_watch
Merci :)