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 :

Ordre de priorité dans les fonctions gtk


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Points : 63
    Points
    63
    Par défaut Ordre de priorité dans les fonctions gtk
    Bonjour à tous !!
    J'ai une application comportant plusieurs menus. Dans un menu composé de 4 togglebuttons et un bouton normal, je souhaite après appui sur ce dernier remettre les 4 premiers en position "non appuyée" (raise).

    Voici le code de la callback
    Code C : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    void
    on_Fen_OPS_btn_Pfm_clicked             (GtkButton       *button,
                                            gpointer         user_data)
    {
    	// Déclarations
    	GtkWidget *vbox;
    	GtkWidget *Menu20_btn_Haut;
    	GtkWidget *Menu20_btn_Bas;
    	GtkWidget *Menu20_btn_Gauche;
    	GtkWidget *Menu20_btn_Droite;
    	GtkWidget *Menu20_btn_Axis;
    	GladeXML *gxml;
    	GList *list;
     
                 // Recupère mon menu
    	gxml = glade_xml_new ("../ch_menu.glade","Menu_20", NULL);
    	vbox = glade_xml_get_widget (gxml, "Menu_20");
     
                 // Je récupère les boutons du menus
              	Menu20_btn_Haut = glade_xml_get_widget (gxml, "Menu20_btn_Haut");
    	Menu20_btn_Bas = glade_xml_get_widget (gxml, "Menu20_btn_Bas");
    	Menu20_btn_Gauche = glade_xml_get_widget (gxml, "Menu20_btn_Gauche");
    	Menu20_btn_Droite = glade_xml_get_widget (gxml, "Menu20_btn_Droite");
    	Menu20_btn_Axis = glade_xml_get_widget (gxml, "Menu20_btn_Axis");
     
                // Je vide le container
    	list = gtk_container_get_children(GTK_CONTAINER(button));
        while(list)
        {
            gtk_widget_destroy(GTK_WIDGET(list->data));
            list = g_list_next(list);
        }
        g_list_free(list);
     
    	gtk_widget_show (vbox);
     
                // J'ajoute mon nouveau menu
    	gtk_box_pack_start (GTK_BOX (GTK_WIDGET(button)), vbox, TRUE, TRUE, 0);
                 // Je connecte mes signaux
    	g_signal_connect_swapped ((gpointer) Menu20_btn_Haut, "clicked",
                                G_CALLBACK (on_Fen_OPS_Menu20_btn_Haut_clicked),
                                GTK_OBJECT (Menu20_btn_Bas));
    	g_signal_connect_swapped ((gpointer) Menu20_btn_Bas, "clicked",
                                G_CALLBACK (on_Fen_OPS_Menu20_btn_Bas_clicked),
                                GTK_OBJECT (Menu20_btn_Haut));
    	g_signal_connect_swapped ((gpointer) Menu20_btn_Gauche, "clicked",
                                G_CALLBACK (on_Fen_OPS_Menu20_btn_Gauche_clicked),
                                GTK_OBJECT (Menu20_btn_Droite));
    	g_signal_connect_swapped ((gpointer) Menu20_btn_Droite, "clicked",
                                G_CALLBACK (on_Fen_OPS_Menu20_btn_Droite_clicked),
                                GTK_OBJECT (Menu20_btn_Gauche));
    	g_signal_connect_swapped ((gpointer) Menu20_btn_Axis, "clicked",
                                G_CALLBACK (on_Fen_OPS_Menu20_btn_Axis_clicked),
                                GTK_OBJECT (Menu20_btn_Droite));
    	g_signal_connect_swapped ((gpointer) Menu20_btn_Axis, "clicked",
                                G_CALLBACK (on_Fen_OPS_Menu20_btn_Axis_clicked),
                                GTK_OBJECT (Menu20_btn_Gauche));
    	g_signal_connect_swapped ((gpointer) Menu20_btn_Axis, "clicked",
                                G_CALLBACK (on_Fen_OPS_Menu20_btn_Axis_clicked),
                                GTK_OBJECT (Menu20_btn_Bas));
    	g_signal_connect_swapped ((gpointer) Menu20_btn_Axis, "clicked",
                                G_CALLBACK (on_Fen_OPS_Menu20_btn_Axis_clicked),
                                GTK_OBJECT (Menu20_btn_Haut));
    }

    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
     
    void
    on_Fen_OPS_Menu20_btn_Axis_clicked            (GtkButton       *button,
                                            gpointer         user_data)
    {
                 // Je mets le bouton en position "raise" (non appuyée)
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button),FALSE);
                 // je le grise
    	gtk_widget_set_sensitive(GTK_WIDGET(button),FALSE);
                 // Je dors 
    	Sleep(1000);
                // Je dégrise mon bouton
    	gtk_widget_set_sensitive(GTK_WIDGET(button),TRUE);
     
    }
    Le comportement attendu est le suivant :
    Après appui sur le bouton normal (bouton AXIS), les 4 autres boutons (quelques soient leur état) doivent revenir en position "non appuyée", se griser. On attends 1s et on les dégrise.
    Hors les boutons ne reviennent en position non appuyée qu'après avoir été dégrisé (fonctionnement constaté)
    Donc je cherche à savoir s'il existe une priorité sur les fonctions propres à gtk ou si qqn peut expliquer ce comportement je suis preneur.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Points : 117
    Points
    117
    Par défaut
    Je pense que ton problème vient du Sleep.
    En effet, si tu fais un Sleep, le processus ne retourne pas vers gtk_main() et l'interface se fige complètement.
    Le seul moyen de palier à ça je pense est d'utiliser un fork ou un thread.
    Bon là vu que c'est juste un Sleep, un fork devrait suffire...

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Kicker Voir le message
    Je pense que ton problème vient du Sleep.
    En effet, si tu fais un Sleep, le processus ne retourne pas vers gtk_main() et l'interface se fige complètement.
    Le seul moyen de palier à ça je pense est d'utiliser un fork ou un thread.
    Bon là vu que c'est juste un Sleep, un fork devrait suffire...
    Nan, premièrement il existe des fonctions de la glib plus portable de fork, deuxièmement, avant de mélanger gtk et les thread il vaut mieux savoir ce que l'on fait : http://library.gnome.org/devel/gdk/s...k-Threads.html

    Comment faire appel à nos propres fonctions ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Points : 117
    Points
    117
    Par défaut
    Ah oui en effet, il y a bien mieux comme solution C'est bon à savoir ça

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par gege2061 Voir le message
    Nan, premièrement il existe des fonctions de la glib plus portable de fork, deuxièmement, avant de mélanger gtk et les thread il vaut mieux savoir ce que l'on fait : http://library.gnome.org/devel/gdk/s...k-Threads.html

    Comment faire appel à nos propres fonctions ?
    Ok pour les thread mais à la vue de la page indiquée je ne trouve pas réellement ce que je veux.
    Je voudrais que mes boutons soient mis en active=FALSE , puis soient grisé et ensuite on dors un certain temps (simulation d'une action qui n'existe pas encore ) puis on les mets à sensitive=TRUE

    Si tu pouvais me donner grossièrement le schéma à appliquer avec les thread et ce que je veux faire ça serait sympa car j'ai du mal à m'y retrouver en appliquant les thread.

  6. #6
    Membre expérimenté
    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
    Points : 1 633
    Points
    1 633
    Par défaut
    La réponse de gégé voulait dire qu'il ne faut pas utiliser les threads Je te recommande de lire la partie de la FAQ qu'il a filé en lien... Ainsi que Comment appeler une fonction à intervalle régulier ? (c'est juste en dessous de ce qu'a lié gégé, mais autant le mentionner explicitement).

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    La réponse de gégé voulait dire qu'il ne faut pas utiliser les threads Je te recommande de lire la partie de la FAQ qu'il a filé en lien... Ainsi que Comment appeler une fonction à intervalle régulier ? (c'est juste en dessous de ce qu'a lié gégé, mais autant le mentionner explicitement).

    Bon j'ai résolu mon problème !! J'ai utilisé la fonction g_idle_add_full (). En fait je "raise" mes toggles boutons puis je les rends inactifs et le reste du traitement (simulation commande puis dégriser les boutons) est effectué par une fonction appelé à l'aide de g_idle_add_full.

    Voilà.

    Pour info si certains sont intéressés par le code :
    Callback de départ :
    Code C : 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
    18
    19
    20
    21
    22
     
     
    void
    on_Fen_OPS_Menu20_btn_Axis_clicked            (GtkButton       *button,
                                            gpointer         user_data)
    {
    	//Déclarations
    	guint id;
     
    	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(Menu20_btn_Bas),FALSE);
    	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(Menu20_btn_Gauche),FALSE);
    	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(Menu20_btn_Droite),FALSE);
    	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(Menu20_btn_Haut),FALSE);
     
    	gtk_widget_set_sensitive(GTK_WIDGET(Menu20_btn_Bas),FALSE);
    	gtk_widget_set_sensitive(GTK_WIDGET(Menu20_btn_Gauche),FALSE);
    	gtk_widget_set_sensitive(GTK_WIDGET(Menu20_btn_Droite),FALSE);
    	gtk_widget_set_sensitive(GTK_WIDGET(Menu20_btn_Haut),FALSE);
     
    	id=g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,(GSourceFunc)raise,button,NULL);
     
    }

    code de la fonction raise
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    guint raise(gpointer data)
    {
    	Sleep(10000);
     
    	gtk_widget_set_sensitive(GTK_WIDGET(Menu20_btn_Bas),TRUE);
    	gtk_widget_set_sensitive(GTK_WIDGET(Menu20_btn_Gauche),TRUE);
    	gtk_widget_set_sensitive(GTK_WIDGET(Menu20_btn_Droite),TRUE);
    	gtk_widget_set_sensitive(GTK_WIDGET(Menu20_btn_Haut),TRUE);
     
    	return FALSE;
    }

  8. #8
    Membre expérimenté
    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
    Points : 1 633
    Points
    1 633
    Par défaut
    J'utilisreais g_timeout_add pour virer le Sleep (10000) perso

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Decalage, Probleme d'ordre d'entrée dans les fonctions
    Par clouddd dans le forum Débuter
    Réponses: 2
    Dernier message: 25/04/2010, 22h15
  2. [FLASH 8] Ciblage dans les fonctions
    Par abenhass dans le forum Flash
    Réponses: 2
    Dernier message: 14/12/2005, 14h00
  3. "_" dans les fonctions
    Par reggae dans le forum C
    Réponses: 3
    Dernier message: 30/09/2005, 19h08
  4. Réponses: 2
    Dernier message: 07/10/2004, 17h00
  5. [plpgsql] transaction dans les fonctions ?
    Par hpghost dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/06/2004, 16h56

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