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 :

Fonction pour afficher un compteur


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut Fonction pour afficher un compteur
    Bonjour,

    je souhaite intégré dans mon programme un compteur qui compte le nombre de seconde depuis le lancement du programme, et pour cela j'ai utilisé g_timeout_add, mais j'ai un petit problème :

    Enfaite le compteur est affiché dans un bouton, il faut donc que toute les 1 seconde je change le label du bouton en l'incrémentant, mais avec la fonction g_timeout_add je ne peux envoyer qu'une chose à ma fonction ( mon bouton ) .
    Au début le label du bouton contient 0, si je fais gtk_button_get_label je peux récuperer ce 0 mais je ne sais pas comment le stocker afin de l'incrémenter.

    Merci d'avance

  2. #2
    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 soit utiliser une structure où tu stockes ta valeur et ton bouton et tu passes ça à ta fonction callback, ou bien tu peux récupérer le texte courant du bouton, le convertir en chiffre (avec strtoul par exemple) puis l'incrémenter et le réafficher.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut
    merci pour ton aide.
    J'ai réussi a convertir le label du bouton en un int, je l'ai incrémenter mais je ne sais pas comment le reconvertir en un gchar pour pouvoir faire gtk_button_set_label(GTK_BUTTON(temps), mavariable).

    Voila ce que j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    char *p_conv = NULL;
     
       /* conversion en base decimale */
       a = (int)strtol(gtk_button_get_label(GTK_BUTTON(bouton)), &p_conv, 10);
     
       /* conversion reussie */
       if(*p_conv == 0)
       {
    	a++;
          // Il faut que je fasse la convertion inverse ici
     
       }

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     /* conversion reussie */
       if(*p_conv == 0)
       {
            gchar *label;
    	a++;
            label = g_strdup_printf ("%d", a);
            gtk_button_set_label (button, label);
            g_free (label);
       }
    quelque chose comme ça devrait faire l'affaire

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut
    Merci pour ton aide, ça fonctionne maintenant,
    j'ai une autre question le code compile bien et le programme fait ce que je veux, par contre ma fonction temps renvoi la valeur TRUE, car si je renvoi autre chose g_timeout_add s'arrète, sauf que quand je compile j'ai un warning :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    main.c: In function ‘ftemps’:
    main.c:209: warning: return makes pointer from integer without a cast
    Dans le main() j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_timeout_add(1000,(GSourceFunc)ftemps, temps);
    et ma fonction est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    GSourceFunc ftemps(GtkWidget *bouton)
    {
     
    .
    .
    .
    .
    .
    return FALSE	;
    }
    C'est pas vraiment génant mais comme j'ai un projet à rendre, j'aimerais bien qu'il ny ai aucun warning.

  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
    Oui, le prototype de ta fonction indique que tu veux qu'elle renvoie un pointeur, change le pour indiquer que tu souhaites renvoyer un gboolean et ça devrait fonctionner comme tu le souhaites

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut
    merci ça fonctionne bien.
    Enfaite j'ai encore une petite question , est-ce que après le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    label = g_strdup_printf ("%d", a);
    je peux faire un strcat pour rajouter "secondes ecoulee" ? est-ce que sa ne poserai pas un problème pour la reconversion suivante ( char --> int ) ?
    Merci

  8. #8
    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
    Euh non, tu ne peux jamais faire de strcat sur la chaîne renvoyée par g_strdup_printf. Ca ne serait pas vraiment utile de toute façon vu que g_strdup_printf ("%d secondes écoulées", secondes); fera ce que tu veux

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut
    Mais si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_strdup_printf ("%d secondes écoulées", secondes);
    sa affiche bien 1 seconde ecoulees mais sa reste bloqué sur 1, je pence que si je rajoute des lettres il y'a un problème à ce niveau la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     a = (int)strtol(gtk_button_get_label(GTK_BUTTON(bouton)), &p_conv, 10);

  10. #10
    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
    Plusieurs remarques :

    1. Relire le texte et extraire la valeur pour l'incrémenter est une mauvaise idée. Tu peux très bien stocker le nombre de secondes dans une variable entière, et l'utiliser pour mettre à jour ensuite le texte.

    2. Utilise g_timeout_add_seconds plutôt que g_timeout_add. Il est plus adapté à des timeouts multiples d'une seconde.

    3. Ne pars pas du principe que ton nombre de seconde écoulé depuis le lancement vaut la valeur d'un compteur incrémenté en réponse à un timeout. La documention spécifie que la précision d'un timeout n'est pas assurée. En gros, si à un moment une application utilise trop le processeur, la tienne risque d'être réveillée tardivement, après plus d'une seconde. Si cela arrive trop souvent, ton compteur ne sera plus représentatif du temps écoulé. La bonne technique consiste donc, dans la callback de réponse au timeout, à recalculer à chaque fois le temps écoulé depuis le lancement du programme. Tu peux connaitre le temps actuel avec g_get_current_time ou utiliser un GTimer. Tu trouveras tout cela dans les fonctions de gestion du temps de la GLib.

    4. Pour savoir pourquoi ton compteur reste bloqué à 1, regarde comment est formée une GSourceFunc, notamment sa valeur de retour, et ce qu'elle signifie.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 24
    Par défaut
    merci pour ta réponse

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/02/2010, 10h25
  2. [Dates] Fonction pour afficher les dernières news
    Par Justone22 dans le forum Langage
    Réponses: 23
    Dernier message: 04/08/2008, 22h57
  3. Fonction pour afficher une image
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 31/08/2007, 19h07
  4. Réponses: 9
    Dernier message: 17/02/2006, 11h04

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