Thread en C avec gtk

Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009 - 6 juil. 2007 à 08:58
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009 - 8 juil. 2007 à 09:31
Bonjour,

Je suis actuellement sur un programme utilisant la bilbiotheque gtk. J'ai une zone de texte (gtk_text_view_new()) et j'aimerais afficher du texte dedans mais en temps reel.

Je m'explique : jai un fichier FILE* qui contient par exemple une lettre et ce fichier est modifie en continu par un programme. J'aimerais alors afficher dans ma zone de texte les lettres au fur et a mesure en temps reel.

Si quelqu'un peut m'expliquer la methode a suivre je l'en remercie d'avance.

ps : clavier anglais alors pas d'accents : /

8 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
6 juil. 2007 à 10:14
Salut,

Bah ça à pas l'air trivial en gtk. Peut être qu'utiliser un timer dans le thread principal peut s'avérer une bonne solution de rechange.

Une FAQ qui en parle.
De la doc.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
6 juil. 2007 à 19:12
Ca sera le meme pb avec n'importe quelle lib graphique. Il faut un timer pour rafraichir la gui, et ton thread pour remplir un buffer.
0
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
7 juil. 2007 à 06:56
Je le ferais par du multiplexage d'entrée/sorties synchrone avec select(), sans timer ni thread.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
7 juil. 2007 à 23:39
luthor -> Y a des libs graphiques qui propose ce qu'il faut : la VCL avec synchronize, et les Winforms, avec invoke. (Mais bon c'est sûr que c'est pas un avantage transcendant sur gtk.)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
8 juil. 2007 à 07:48
katsankat > pourrais-tu developper un peu ton idee stp ?
0
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
8 juil. 2007 à 09:16
OK.
C'est une méthode comme une autre. Comme souvent en informatique il existe plusieurs moyens d'arriver au même résultat. Celle du thread+timer est probablement plus répandue et en tout cas elle tient la route.

Le multiplexage d'entrées-sorties synchrone consiste à demander au système d'exploitation (appel système 63 sous linux) de placer des descripteurs de fichier en observation et de nous prévenir quand des données sont disponibles en lecture, ou en écriture (c'est une bonne alternative aux threads et aux sockets non-bloquants pour l'écriture de serveurs où on a besoin de traiter ce qui rentre et ce qui sort sans bloquer).

Le fonctionnement de select() repose sur l' utilisation d'une structure fd_set qui est un tableau d'index constituée de 1024 bits. La structure comporte aussi un membre fd_count qui dit combien de descripteurs sont actuellement en observation dans le fd_set. (attention sous wondows la structure est différente, car microsoft différents dans leur implémentation -pardon appropriation- des standards comme d'habitude).

On crée un fd_set puis le remplit de zéros avec la macro FD_ZERO.
On ajoute un descripteur de fichier à un fd_set avec la macro FD_SET, macro FD_CLR pour le retirer.

Quand le fd_set est prêt, le fait d'invoquer le fonction select:

  int select(int n, fd_set *readfds, fd_set *writefds,
        fd_set *exceptfds, struct timeval *timeout);

... Détermine sur quels descripteurs de fichiers des données sont disponibles en lecture, en écriture, et exceptions. Dans ton cas tu pourrais passer NULL aux 3e et 4e arguments.
Après avoir invoqué select(), un coup de FD_ISSET sur le descripteur s'assure que le descripteur est bien présent dans l' ensemble. Si oui alors là tu faire un fread pour appeler ta fonction gtk_add_text.

Dans ton cas se pose aussi la question de la fréquence d'appel de select(). Tu peux le mettre dans une boucle infinie (0% CPU), ou alors faire un sleep, ou encore avec un timer ça dépend du contexte de l' appli.

Bref select() est un appel système très puissant.
0
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
8 juil. 2007 à 09:20
Maintenant que j'y pense, GTK a ce qu'il faut ça marche très bien
http://developer.gnome.org/doc/API/2.0/gdk/gdk-Input.html
0
Yunchi Messages postés 100 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 14 avril 2009
8 juil. 2007 à 09:31
Merci pour toutes ces infos katsankat je testerai ces methodes le plus tot possible :)
0
Rejoignez-nous