IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

Gtk et communication père fils


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut Gtk et communication père fils
    Bonjour

    J'avais pensé faire une communication père-fils (un concept que j'essaie d'apprendre) sous GTK en laissant au fils l'adresse d'un GtkEntry afin qu'il puisse y écrire ce qu'il veut. Mais, ça ne marche pas !
    L'adresse du GtkEntry est bien restée la même, mais le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_entry_set_text(GTK_ENTRY(adresse_gtkentry),buffer);
    ne marche pas : rien n'est écrit.
    Il faudrait que le père puisse lancer une boucle non bloquante pour attendre l'information venant du fils. Ul petit programme parallèle... Mais pas un fils car le problème resterait le même !

    Je me dis que si je peux éviter carrément la notion de fils et faire directement une boucle d'attente non bloquante en parallèle avec le programme comme on lance des fenêtres, ce serait aussi bien !

    Je regarde gtksocket, mais mon niveau d'anglais me permet juste de comprendre que ça pourrait être utile. Pas de l'utiliser
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Je reviens un peu sur le problème...

    Dans une fonction, je n''ai une boucle infinie : attente de communication par socket.
    Si je me débrouille pour sortir dès la première communication, je vois qu'elle a bien été traité.
    Si je reste en permanence dedans, gtk bloque : plus d'affichage.

    Si je passe la fonction (avec tous les paramètres) en fils avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      pid_t pid= fork();
      if (pid!=0) return;
    Ça plante !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  3. #3
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    J'ai du mal a saisir ce que tu cherches à faire. Maintenant tu peux toujours lancer un thread avec les fonctions associées au GThread.

    Si tu passes par cette solution attention. Tu ne pourras pas agir directement depuis le thread sur les widgets de la boucle principale GtkMain. Si tu manipules des données communes il te faudra utiliser les GMutex en complément.

  4. #4
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Je souhaite que mon programme ouvre un fichier. Je lui passe le chemin vers le fichier et il l'ouvre.

    En pratique j'ai une fenêtre maîtresse à partir de laquelle je peux ouvrir plein de fichiers. Si j'appelle une autre fois mon programme avec un nom de fichier en paramètre, je souhaite que ce soit la première fenêtre qui ouvre/gère le fichier afin de ne pas ouvrir à nouveau une fenêtre maîtresse. Le second appel et les suivants ne feront que passer le nom de la fenêtre.
    J'arrive à gérer ce passage de paramètres, mais il est bloquant. C'est à dire que qui j'attends un seul passage, mon programme récupèrera le nom du fichier passé et l'application graphique se sera active qu'à ce moment ! Pas avant car ça bloque.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par troumad Voir le message
    ... Si j'appelle une autre fois mon programme avec un nom de fichier en paramètre, je souhaite que ce soit la première fenêtre qui ouvre/gère le fichier afin de ne pas ouvrir à nouveau une fenêtre maîtresse...
    Donc il faut que ton programme, lors de son lancement, vérifie qu'il n'existe pas déjà une instance de lui-même. Le post suivant traite déjà de ce sujet.

    Ensuite, si ton application est lancée, il faudrait peut être prévoir une "porte ouverte" pour lui donner un nom de fichier pendant son fonctionnement. Ici je pencherai pour les GIOChannel. Tu peux écouter un fichier, une pipe ou un socket sans être bloquant.

  6. #6
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    libunique fait cela pour GTK2. Pour GTK 3 c'est inclus de base dans GApplication ou GtkApplication.

  7. #7
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Donc il faut que ton programme, lors de son lancement, vérifie qu'il n'existe pas déjà une instance de lui-même.
    C'est bon, avec le socket ça passe sans problème
    Citation Envoyé par gerald3d Voir le message
    Ensuite, si ton application est lancée, il faudrait peut être prévoir une "porte ouverte" pour lui donner un nom de fichier pendant son fonctionnement. Ici je pencherai pour les GIOChannel. Tu peux écouter un fichier, une pipe ou un socket sans être bloquant.
    Je voterai pour un socket.

    Ai-je bien raison quand je pense ceci :

    Le paramètre d'entrée de g_io_channel_unix_new () (http://developer.gnome.org/glib/stab...el-unix-get-fd ) est bien la sortie de socket(AF_UNIX, SOCK_STREAM, 0)

    Après, je lance le système non bloquant avec g_io_add_watch () .

    La fonction déclarée dans g_io_add_watch () utilise g_io_channel_read_line () ou g_io_channel_read_line_string () pour récupérer les données arrivant dans le socket. La seconde fonction me fait peur car je ne vois pas comment est gérée la taille du buffer. g_io_channel_read_to_end () pourrait aussi convenir, elle me semble plus simple car il n'y a pas la gestion d'un caractère de fin spécifique.

    Pour passer un message au socket, j'utilise g_io_channel_write_chars ().

    Quand j'ai fini de me servir d'un chanle, je dois le fermer avec g_io_channel_close () . Est-ce bien obligatoire ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

Discussions similaires

  1. Communication père/fils tableau d'entiers.
    Par boblinux dans le forum Débuter
    Réponses: 13
    Dernier message: 26/11/2014, 16h09
  2. Mauvaise communication père/fils signaux
    Par Shargat dans le forum Débuter
    Réponses: 4
    Dernier message: 14/03/2010, 12h14
  3. Champ père-Fils
    Par marie10 dans le forum Access
    Réponses: 3
    Dernier message: 28/02/2006, 13h17
  4. [pthread] relation père - fils ?
    Par jedimind dans le forum C
    Réponses: 3
    Dernier message: 14/11/2005, 11h18
  5. [MFC] multithread, communication père<->fils
    Par Joeleclems dans le forum MFC
    Réponses: 19
    Dernier message: 19/05/2005, 10h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo