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 :

g_timeout_add comment faire la fonction appelée


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 122
    Points : 63
    Points
    63
    Par défaut g_timeout_add comment faire la fonction appelée
    Bonjour tout le monde.

    Je voudrais faire un compteur, un chronometre. Voila mon idée:

    J'ai créé un bouton pBoutonTemps avec comme label le temps. Donc toutes les 1000 ms j'appelle une fonction que changera le label de ce bouton le probleme est comment faire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        pBoutonTemps=gtk_button_new_with_label("");
        gtk_table_attach_defaults(GTK_TABLE(pTable), pBoutonTemps,2,6,13,15);
     
        g_timeout_add(1000, temps, pBoutontemps);
    Je sais que la fonction appelé doit être comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    guint temps(gpointer pdata)
    Le probleme est que je ne sais pas quoi mettre dedans pour que le label change toutes les secondes

    J'aimerais donc que quelqu'un puisse m'écrire cette fonction.

    En vous remerciant par avance

  2. #2
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 122
    Points : 63
    Points
    63
    Par défaut
    J'ai fait ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    guint temps(gpointer data)
    {
        GtkWidget *pBoutonTemps=(GtkWidget*) data;
        gtk_button_set_label (GTK_BUTTON(pBoutonTemps),chrono);
        chrono++;
     
        return TRUE;
    }
    sachant que chrono est une varibla globale initialisée a 0.

    Le truc c'est que mon programme se ferme tout seul au bout de 1 seconde

  3. #3
    Invité
    Invité(e)
    Par défaut
    Trop bien ce forum, on peut déterrer un topic 6 ans après.

    Pas trouvé la réponse ?

  4. #4
    Inactif  

    Homme Profil pro
    développeur Vala
    Inscrit en
    Février 2011
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : développeur Vala
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 478
    Points : 3 700
    Points
    3 700
    Par défaut
    utiliser la boucle de glib ?
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GMainLoop *         g_main_loop_new                     (GMainContext *context,
                                                             gboolean is_running);
    Sinon comme Gtk est utilisé ici, tu as aussi : que tu quittes en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void        gtk_main_quit                   (void);
    (marquer un post résolu si vous êtes satisfait de la réponse )
    ma page launchpad https://launchpad.net/~inizan-yannick
    ma page github : https://github.com/inizan-yannick

  5. #5
    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
    Points : 2 002
    Points
    2 002
    Par défaut
    @rotverp: j'ai du mal à voir le rapport avec la question initiale... C'est sur le fait que sont programme se ferme au bout d'une seconde, tu penses qu'il ne lance pas la main loop gtk ?

    Perso pour réaliser ce type de programme, on peut résumer à :
    - utiliser g_timeout_add pour appeler une callback régulièrement, dont la signature est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    guint g_timeout_add (guint interval, GSourceFunc function, gpointer data)
    et pour la callback:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gboolean (*GSourceFunc) (gpointer user_data)
    - passer en paramètre data le pointeur vers le widget qui affiche le temps écoulé

    Ensuite l'erreur à ne pas commettre, c'est se fier au timing avec lequel est appelé la callback. Ce timing est approximatif, il n'y a pas de garantie:
    Note that timeout functions may be delayed, due to the processing of other event sources. Thus they should not be relied on for precise timing. After each call to the timeout function, the time of the next timeout is recalculated based on the current time and the given interval (it does not try to 'catch up' time lost in delays).
    Pour éviter cela, il faut donc utiliser un GTimer à déclencher en même temps que le chronomètre, et dans la callback, ajuster le temps restant pour atteindre une seconde plaine, et rappeler g_timeout_add avec ce temps restant. Cela évite de cumuler les erreurs. Bien sûr, la callback doit retourner toujours FALSE pour ne pas être appelée à nouveau par la même source, sinon elle serait appelée 1 fois à la 1ère seconde, 2 fois à la 2ème, etc.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  6. #6
    Inactif  

    Homme Profil pro
    développeur Vala
    Inscrit en
    Février 2011
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : développeur Vala
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 478
    Points : 3 700
    Points
    3 700
    Par défaut
    oui, j'ai tout de suite pensé qu'il ne lançait pas la boucle main de Gtk
    (marquer un post résolu si vous êtes satisfait de la réponse )
    ma page launchpad https://launchpad.net/~inizan-yannick
    ma page github : https://github.com/inizan-yannick

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

Discussions similaires

  1. comment faire cette fonction de temps
    Par yassin123441 dans le forum C++
    Réponses: 4
    Dernier message: 14/03/2007, 23h19
  2. Comment faire une fonction - procédure
    Par Madmac dans le forum C
    Réponses: 14
    Dernier message: 12/08/2006, 09h57
  3. Comment faire une fonction qui renvoi un tableau.
    Par poly128 dans le forum Delphi
    Réponses: 2
    Dernier message: 01/06/2006, 01h04
  4. [C#][Débutant] Comment faire une fonction FindWindow ?
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 4
    Dernier message: 27/04/2006, 13h19
  5. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13

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