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+] Evênement depuis une lib


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut [GTK+] Evênement depuis une lib
    Bonjour,
    Je suis débutant en GTK+, j'ai fait quelques magnifiques interfaces graphiques ces derniers jours et cela me plais bien. Avant de me lancer dans un super gros projets, je voulais avoir quelques confirmations histoire de me rassurer.

    Voilà ce que je compte faire:
    Un projet qui gère une IHM et qui fait appelle à une lib (qu'il faut que je code)
    Cette lib servirai à contrôler une caméra.

    Mes questions sont:
    • -Peut-on créer des lib en GTK+ (ca parait peut être con, la réponse sera sans doute GTK+ est fait pour l'interface graphique, ta lib devra être basée sur Glib mais je ne distincte pas encore bien la différence)
    • -Est ce que ma lib peut m'envoyer un signal (du genre: "hey il y a du mouvement!!!") et que ce signal peut être interprété par mon projet qui gère l'IHM (du genre: mise à jour d'un label: "détection: mouvement !")
    • -Quelle fonction me permettrai d'envoyer et d'attendre ce signal? (suis je forcé de faire un thread?)


    Pour info je suis sous Fedora core 11
    Merci à ceux qui prendront le temps de me lire

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 47
    Par défaut
    Bonjour,

    Désolé, mais je n'ai pas de réponse pour toi, cela fait 2 jours que j'essaie de faire une application avec le même principe et l'avancé est laborieuse.

    Mais si quelqu'un annonce qu'il n'est pas possible qu'une librairie (ou une fonction "non-gtk") modifie l'affichage d'une fenêtre gtk. Je serais plutôt pas content.
    Et si quelqu'un à la solution. "ça va être bien"
    Vivement la fin du suspens.

    salutation

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Tu peux faire des libs qui utilisent gtk+ pour faire de l'affichage graphique, http://www.chipx86.com/w/index.php/Libsexy par exemple me vient en tête. Et tu peux aussi faire des libs sans interface graphique qui utilise cette fois ci la glib et les gobjects pour bien s'intégrer à des applis gtk+ (ie utilisation de la mainloop, utilisation des signaux, ...), la libgudev serait un exemple, y a la libgnet, ...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    Bonjour Teuf et merci pour ta réponse,
    Je suis aussi content de voir que ma question intéresse d'autre personne

    Alors, ma librairie n'a pas pour objectif de modifier l'IHM directement ni d'avoir quoi que se soit de graphique, je peux donc oublier GTK+ pour mes lib et me rabattre sur la Glib si j'ai bien compris.

    Du coup est-il possible que ma lib (est-ce bien un .so?) envoie un signal à mon application GTK+ afin que celle ci modifie un de mes label (par exemple)
    Je pense bien que oui mais comment une lib peut générer se signal et comment l'application peut-elle l'attraper?

    Quand je suis dans le cas
    Appli appelle fonction d'init de la lib
    Lib répond que tout est ok,
    cela ne pose pas de soucis vu que l'appli attend la réponse de la fonction d'init

    Mais quand je suis dans le cas:
    Lib me signal qu'elle voit du mouvement
    Comment envoyer cette info à l'appli pour qu'elle le gère?
    Merci encore pour votre aide

  5. #5
    Membre éprouvé Avatar de alexrtz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 639
    Par défaut
    Citation Envoyé par Skarsnick Voir le message
    Je pense bien que oui mais comment une lib peut générer se signal et comment l'application peut-elle l'attraper?
    Dans ta lib :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    record_callback(function f)
    {
     callback = f;
    }
     
    send_signal(signal s)
    {
     callback(s);
    }
    Dans ton programme principal :
    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
     
    process_signal(signal s)
    {
     switch(s)
     {
       case machin:
         blabla
       ...
     }
    }
     
    main()
    {
     blabla
     record_callbakc(process_signal);
     blabla
    }
    Pour plus de précisions, tu peux aller voir des tutos traitant des fonctions de callback et des pointeurs de fonctions.

    Si tu veux voir un peu plus en détails comment on peut "s'abonner" à des messages, regarde du côté du pattern observer (qui ne te servira probablement pas dans le cas présent, mais c'est toujours bon pour la culture )

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Moui, gtk+ propose tout un framework pour gérer ce genre de choses, c'est pas forcément la peine de réinventer la roue. C'est plus complexe à faire, mais ça s'intégrera mieux à gtk+ (ie tu te connectes à tes signaux via g_signal_connect comme les signaux gtk+ standard). Je t'invite à lire http://nicolasj.developpez.com/gobject/classe/ et http://franckh.developpez.com/tutori...ation-signaux/ en espérant que ça ne te décourage pas

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    Merci pour vos réponses!

    J'avais déjà lu ce lien:
    http://franckh.developpez.com/tutori...ation-signaux/
    Mais j'ai peut être mal compris, pour moi ce tuto expliquait comment créer un événement sur un widgets qui n'était pas un bouton (comme cliquer sur un label etc...)

    J'avais essayer vite fait en m'appuyant sur ce tuto de faire un:
    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
     
    main()
    {
    créer Bouton
    Lier bouton à évenement (fonction1)
    }
     
    fonction1
    {
    Sleep 3 sec
    Envoyer un événement vers fonction2 (donc sans intervention utilisateur)
    }
     
    fonction2
    {
    Updater un label
    }
    Mais je n'avais pas réussi, j'ai du m'y prendre comme un pied ^^
    Je m'appuyais sur la fonction g_signal_connect en lui passant comme argument ma Hbox dans lequel était le bouton et le label

    J'avais aussi tenter avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_emit_by_name(Hbox,"coucou");
    En mettant un peu plus haut un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(Hbox,"coucou",G_CALLBACK(UpdateLabel),(gpointer*) Hbox)
    Je regarde vos liens
    Ton GOject me fait un peu peur mais j'ai qq bases en C++ faut que je me dérouille^^

  8. #8
    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
    Ta bibliothèque, c'est juste du code qui a été déporté dans un fichier (.so) à part plutôt que de le conserver dans ton application. L'utilisation et l'appel dans le code est identique. La seule différence, c'est qu'au moment de l'édition de lien, le linker doit indiquer avec quel bibliothèque il doit lier le programme.
    http://library.gnome.org/devel/gtk/s...compiling.html
    l'option "-lglib-2.0" passé à la compilation indique par exemple que ton programme doit être lié à la bibliothèque glib-2.0.
    Il faut passer au compilo les options -l (et si ta bibliothèque est dans un chemin non standard, l'option -L)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -lle_nom_de_ta_bibliotheque
    -Lle_chemin_du_repertoire_qui_contient_ta_bibliotheque
    Pour ce qui est de ta lib qui doit mettre à jour un objet, il vaut mieux toujours que ce soit l'appli qui demande des choses à la lib que la lib qui prévient l'appli. La lib doit contenir du code réutilisable pour une autre appli, et doit donc être au maximum indépendante de l'appli initiale. Si tu as tout de même besoin d'envoyer des signaux à des widgets, alors il et suffit d'appeler g_signal_emit dans une fonction de ta lib.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void malib_envoyer_signal (GObject *obj)
    {
         g_signal_emit (obj, .....);
    }

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    Merci pour cette réponse, j'ai réussi à faire un pas en avant
    Mon appli(IHM) appelle une fonction de ma lib (Middleware) qui appelle une fonction de ma lib (basse)

    Donc dans le sens IHM => Middleware => Basse => Middleware => IHM
    ca fonctionne bien.

    Je vais tenter de bosser sur le g_signal_emit (obj, .....);
    pour faire du Basse => Middleware => IHM sans intervention préalable de l'appli IHM
    En faite le but (c'est un peu space) C'est de ne mettre quasi aucun code dans l'IHM (seulement la gestion de l'IHM, aucun traitement)

    Je sens que ce qui va être galère c'est de donner à la lib Middleware l'obj qui lui dépend de l'IHM...
    Il y a pas une fonction qui envoi un event sans passer par un obj?

    Dans ce cas ma lib pourrait dire "hey j'ai vu un truc" et l'IHM ferrait:
    Si elle a "vu un truc" j'update ce label

    Je crois que la solution est peut être dans le poste de rurouni alex que je n'ai pas encore eu le temps de tester

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    Bon j'arrive pas trop à utiliser l'idée de rurouni alex,

    Je vais donc résumer mon problème en une question ^^

    Comment puis-je envoyer un événement SANS intervention de l'utilisateur?


    Dans tous les tuto que j'ai parcourus j'ai:
    Afin de faire réagir une application aux actions de l'utilisateur, Gtk+les traite comme des évènements dans une boucle événementielle.
    Mais ça doit bien être possible de faire ça sans que l'utilisateur clic, touche au clavier ou à quoi que ce soit non?

    Merci encore pour votre aide

  11. #11
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Tu veux envoyer un evt quand il se passe quoi concrètement ?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    Concrètement j'aimerais que ma lib qui gère ma caméra m'envoie un signal quand elle détecte du mouvement...

    Mais je vais y aller par étape
    Déjà si j'arrive à faire en sorte que quand j'appuie sur un bouton ca lance une fonction (ça je sais faire, rassure toi :p) mais que cette fonction m'envoie un signal (avec une tempo ou non) pour lancer une seconde fonction... je serai heureux^^

  13. #13
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Tu peux faire ça en mettant des g_idle_add/g_timeout_add pour vérifier ce qu'"il se passe régulièrement, tu peux peut être utilise un giochannel pour détecter quand des données sont dispos sur ta caméra, ... Ca te permettra d'appeler une fonction sansa ction de l'utilisateur.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    Ce que tu dis me plais bien
    J'ai testé, dans la fonction d'un de mes boutons j'ai mis un
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    gboolean test(gpointer data)
    {
        FILE * f = fopen("teuf.txt","a");
        return TRUE;
    }
    Et j'ai bien la création de mon fichier, comme quoi il passe bien dedans
    J'espère que l'histoire des priorités ne bloquera rien ^^

    Bon je vais tester d'appeler une fonction de ma lib maintenant faut que je les redéclare en gboolean NOM(gpointer data)

    Mais bon encore une fois ca va dans le sens IHM appelle Lib je vois mal ma lib appeler une fonction de mon appli IHM^^
    Au pire je fais tourner un thread qui regarde un champ de bool (vicieux le thread) et qui appelle les fonctions qu'il faut au bon moment.
    En espérant que ca soit pas comme les winform et donc qu'un thread secondaire puisse toucher à l'IHM sans tout faire planter ^^

    Merci

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    Bon sans surprise ca marche aussi avec des fonctions de ma lib si je les déclare correctement.
    Mais en faite ça remplace juste un appel (à ça près que ça n'attend pas le retour de la fonction pour continuer si j'ai bien compris) donc c'est pas vraiment ce que je veux...

  16. #16
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Citation Envoyé par Skarsnick Voir le message
    Au pire je fais tourner un thread qui regarde un champ de bool (vicieux le thread) et qui appelle les fonctions qu'il faut au bon moment.
    En espérant que ca soit pas comme les winform et donc qu'un thread secondaire puisse toucher à l'IHM sans tout faire planter ^^

    Je te déconseille très fortement de mélanger gtk+ et les threads.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    Je crois que je vais suivre ton conseil ^^
    Je reviendrai sur ce sujet en tant voulu, je le laisse de côté un moment, j'aurais peut être d'autres idées sous peu.
    Merci

  18. #18
    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
    Citation Envoyé par teuf13 Voir le message
    Tu peux faire ça en mettant des g_idle_add/g_timeout_add pour vérifier ce qu'"il se passe régulièrement, tu peux peut être utilise un giochannel pour détecter quand des données sont dispos sur ta caméra, ... Ca te permettra d'appeler une fonction sansa ction de l'utilisateur.
    Non, tu lui proposes de faire du polling là, avec un g_timeout_add... Et g_idle_add c'est pareil, il va devoir vérifier à chaque fois s'il a vu quelque chose. Ce qu'il lui faut, c'est créer une nouvelle source d'évènements (dérivée de GSource). Si sa caméra lui fournit la fonctionnalité permettant d'avoir l'évènement "détection de mouvement", il n'aura pas de polling à faire, juste l'évènement à remonter. Si c'est à lui de détecter le mouvement, alors y a pas de secret, ce sera à lui de faire le boulot dans sa source d'évènements.

  19. #19
    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
    Citation Envoyé par Skarsnick Voir le message
    Bon sans surprise ca marche aussi avec des fonctions de ma lib si je les déclare correctement.
    Mais en faite ça remplace juste un appel (à ça près que ça n'attend pas le retour de la fonction pour continuer si j'ai bien compris) donc c'est pas vraiment ce que je veux...
    Si, ça attend le retour de ta fonction. g_idle_add te permet de définir une source d'évènements qui se déclenche quand il n'y a rien à faire, pour exécuter ton code à toi. Tant que ta callback renvoie TRUE, et que la main loop tourne, elle est appelée.

  20. #20
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Citation Envoyé par liberforce Voir le message
    Non, tu lui proposes de faire du polling là, avec un g_timeout_add... Et g_idle_add c'est pareil, il va devoir vérifier à chaque fois s'il a vu quelque chose. Ce qu'il lui faut, c'est créer une nouvelle source d'évènements (dérivée de GSource). Si sa caméra lui fournit la fonctionnalité permettant d'avoir l'évènement "détection de mouvement", il n'aura pas de polling à faire, juste l'évènement à remonter. Si c'est à lui de détecter le mouvement, alors y a pas de secret, ce sera à lui de faire le boulot dans sa source d'évènements.
    Oui, c'est aussi une solution, la solution avec des GIoChannels permet aussi de faire ça sans polling, mais vu que j'ai aucune idée si la caméra donne des infos quand des données sont dispos, j'ai mis les 2 possibilités...

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/10/2010, 14h04
  2. Lancer une application depuis une fenêtre gtk
    Par cyrilleG dans le forum GTK+ avec Python
    Réponses: 11
    Dernier message: 29/09/2007, 22h03
  3. [Débutant] - Accès à GTK depuis une classe
    Par Leobaillard dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 03/06/2007, 13h09
  4. Réponses: 2
    Dernier message: 26/02/2003, 11h47
  5. Réponses: 1
    Dernier message: 22/08/2002, 17h00

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