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 :

Boucle lente dans une fonction


Sujet :

GTK+ avec C & C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 24
    Points : 18
    Points
    18
    Par défaut Boucle lente dans une fonction
    Bonjour,

    J'ai fait une fenêtre avec un bouton et un label. lorsque l'on clic sur le bouton la fonction callback suivante est lancé:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void fct_Analyse(GtkToggleButton *toggle_button)
    {
            //la valeur du label de la fenêtre principale devient = a Cnt_Total
    	Refresh();
     
    	while(gtk_toggle_button_get_active(toggle_button))
    	{
                    //variable global
    		Cnt_Total++;
    		gtk_main_iteration ();
     
    	}
    }
    lorsque je clic sur le bouton et que j'attend avant de re cliquer dessus, mon label est toujours incrémenté de 5??? alors qu'il devrait être incrémenté en fonction de l'attente. par contre si je modifie la fonction comme suit:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    void fct_Analyse(GtkToggleButton *toggle_button)
    {
        /* Declaration du widget */
        GtkWidget *test;
        GtkWidget* pLabel;
     
        char buffer [50];
     
        /* Creation de la fenetre */
        test = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        /* Connexion du signal "destroy" */
        /* Creation du label */
        sprintf (buffer, "%d", Cnt_Total);
        pLabel=gtk_label_new(buffer);
     
        /* On ajoute le label a l'interieur de la fenetre */
        gtk_container_add(GTK_CONTAINER(test), pLabel);
     
        /* Affichage de la fenetre et de tout ce qu'il contient */
        gtk_widget_show_all(test); 
     
    	Refresh();
    	while(gtk_toggle_button_get_active(toggle_button))
    	{
    		Cnt_Total++;
    		sprintf (buffer, "%d", Cnt_Total);
    		gtk_label_set_label(pLabel,buffer);
    		gtk_main_iteration ();
    	}
    }
    La on voit la valeur incrémenter à toute vitesse. quelqu'un a une idée de ce qui peu causer le problème?

    merci d'avance

  2. #2
    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
    gtk_main_iteration(), ça ne s'utilise pas comme ça... Je comprends pas bien ce que t'essaie de faire avec ta variabel qui s'incrémente ceci dit. Il serait peut être plus judicieux d'utiliser un g_timeout_add ou un g_idle_add ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    La variable qui s'incrémente sert seulement pour l'instant à me donner une idée de la vitesse de traitement. éventuellement, dans cette fonction, je vais mettre le code pour acquérir et analyser des données à haute vitesse, j'ai donc besoin d'un maximum de temps processeur pour effectuer les calcules.
    Faire g_timeout_add ne pourais pas fonctionner, car mon acquisition et mon analyse se font en temps continue.
    Pour se qui est de g_idle_add, je croix que je pourrais l'utiliser, mais j'ai besoin de quelque précision.
    -Puisque je veux faire l'acquisition et le traitement seulement quand le bouton est enfoncé, est-il possible de passer le GtkWidget * du bouton et l'utiliser pour faire ou ne pas faire l'acquisition et l'analyse.
    -dois-je faire une boucle dans cette fonction pour faire mon analyse en continue, ou si la fonction va est bouclé d'elle même assez rapidement.
    -Si vous avez d'autres suggestion

    merci

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    J'ai fait quelque chose qui fonctionne avec le g_idle_add. dans le main je lance
    g_idle_add(fct_Analyse,NULL);
    ma fonction analyse est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    gboolean fct_Analyse(void)
    {
    	if(Flag_Start)
    		Cnt_Total++;
    	return TRUE;
    }
    La variable global Flag_Start est modifié par la fonction lancé quand on clic sur le bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void fct_Start(GtkToggleButton *toggle_button,GtkWidget *pCnt_Total)
    {		
    	if(gtk_toggle_button_get_active(toggle_button))
    	{
    		Flag_Start=1;
    	}
    	else
    	{
    		Flag_Start=0;
    		gtk_spin_button_set_value(GTK_SPIN_BUTTON(pCnt_Total), Cnt_Total);
    	}
    }
    S'il est possible de faire quelque chose de plus efficace, n'hésitez pas

Discussions similaires

  1. Boucle dans une fonction javascript
    Par edward carnby dans le forum jQuery
    Réponses: 5
    Dernier message: 01/10/2012, 19h54
  2. Boucle dans une fonction
    Par yoyotheboss7 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 14/03/2009, 21h28
  3. Boucle dans une fonction
    Par masseur dans le forum Langage
    Réponses: 6
    Dernier message: 28/11/2006, 16h57
  4. [Postgresql]Connecter à une autre base dans une fonction
    Par alex2205 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/05/2003, 11h30
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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