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 :

probleme avec g_timeout_add_seconds


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé Avatar de GoldenEyes
    Inscrit en
    Avril 2008
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 197
    Par défaut probleme avec g_timeout_add_seconds
    Salut tout le monde ,
    je veux lancer la fonction "traverse" pendant n seconds puis la stopper c'est pour cela j'ai utilisé g_timeout_add_seconds comme ceci :

    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
     
    void  programme_principal()
    {
        int b = 10; 
        guint timeout_id=g_timeout_add_seconds(2, (GSourceFunc)create_timeout,(gpointer) &b);
        traverse(b);
           g_source_remove(timeout_id);
    }
    void create_timeout (int b)
    {
        b= 20; 
        printf ("%d \n", b );
    }
     
    void traverse(int b  )
    {   
      for (int i=0; i <= 1000 && b!=20; i++)
        {
           printf ("%s \n ","hello " );
        }	
    }
    la fonction create_timeout va changer la valeur de b apres 2 seconds et quand la fonction "traverse" recoit la valeur de b a 20 il va arreter
    l'affichage de message "hello ",
    mais j'ai toujour tous les messages "hello" , le programme ne s'arrete plus apres 2 seconds ?

    vous pouvez m'aider ?
    Merci d'avance pour tout aide

  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
    Mets un g_idle_add qui fait 1 seul printf, mets ton timeout, et dans le callback du timeout, fais un g_source_remove sur l'identifiant du g_idle_add, ca devrait faire ce que tu veux.

  3. #3
    Membre confirmé Avatar de GoldenEyes
    Inscrit en
    Avril 2008
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 197
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    Mets un g_idle_add qui fait 1 seul printf, mets ton timeout, et dans le callback du timeout, fais un g_source_remove sur l'identifiant du g_idle_add, ca devrait faire ce que tu veux.
    Merci pour la rèponse ,
    J'ai fait ceci avec "g_idle_add" mais ça marche plus il m'affiche aucun message
    Vous pouvez m'aider ?
    mon but est d'exécuter la foncion traverse pendant n seconds ,

    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
    void traverse(int b  )
    {   
      for (int i=0; i <= 1000 && b!=20; i++)
        {
           printf ("%s \n ","hello " );
        }	
    }
    void create_timeout (int t)
    {
    t= 20; 
    guint  idle_id= g_idle_add((GSourceFunc)traverse,(gpointer) &t); 
    printf ("%d \n", t );
    g_source_remove(idle_id); 
     
    }
    void  programme_principal()
    {
        int b = 10; 
        guint timeout_id=g_timeout_add_seconds(2, (GSourceFunc)create_timeout,(gpointer) &b);
        traverse(b);
           g_source_remove(timeout_id);
    }
    merci d'avance pour tout aide ,

  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
    IL ne faut en aucun cas avoir un callback de timeout ou de idle qui bloque pendant une durée indéterminée (donc les boucles longues sont à prohiber). Ce que j'avais en tête, c'est qque chose du type :

    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
     
    gboolean idle_display (void)
    {
      g_print ("hello\n");
      return TRUE;
    }
     
    gboolean stop_display (gpointer data)
    {
       guint id = GPOINTER_TO_UINT (data);
       g_source_remove (id);
       return FALSE;
    }
     
    int main (int argc, char *argv)
    {
      guint id;
     
      id = g_idle_add (display_idle);
      g_timeout_add (2000, stop_display, GUINT_TO_POINTER (id));
      gtk_main();
     
      return 0;
    }
    J'ai pas testé la compilation, je te laisse corriger les erreurs de syntaxe et les noms de fonction qui sont faux (je pense en particulier aux GUINT_TO_POINTER et GPOINTER_TO_UINT, ils doivent pas s'appeler exactement comme ça

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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