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 infinie ?


Sujet :

GTK+ avec C & C++

  1. #1
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut boucle infinie ?
    Salut à tous !

    Voila j'ai un petit probleme, j'aimerais mettre une boucle infinie dans un programme utilisant GTK (donc il y a deja la boucle infinie événementielle gtk_main() ).
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    gtk_main();
    while(1)
    {
       printf("ok\n");
    }
    Mais biensur ça fonctionne pas, il rentre dans le while(1) une fois gtk_main() terminé
    Je vois pas du tout comment faire, j'espere qu'il y a une astuce

    Merci pour votre aide
    Sorry

  2. #2
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,
    quel est le but de la manip'?
    Avoir OK qui s'affiche continuellement en arrière plan?
    Il faut untiliser gtk_init_add pour ajouter une fonction à appeler lors de l'entrée dans gtk_main. Mais l'appel est surement bloquant donc cette fonction doit elle même faire appel à un thread qui exécutera la boucle.

  3. #3
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par gege2061
    Bonjour,
    quel est le but de la manip'?
    Avoir OK qui s'affiche continuellement en arrière plan?
    Il faut untiliser gtk_init_add pour ajouter une fonction à appeler lors de l'entrée dans gtk_main. Mais l'appel est surement bloquant donc cette fonction doit elle même faire appel à un thread qui exécutera la boucle.
    C'est pour un Client.
    Il reste en attente de reception de messages (d'où le while(1) ), mais quand on clic sur un bouton, il envoie un message...

    Si je t'ai bien compris, je dois faire une fonction CALLBACK qui reste en attente d'un message (avec select...), donc comme ça pas besoin de while(1) ?

  4. #4
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Pourquoi ne pas placer ta boucle avant le gtk_main_quit :

    Nas'

  5. #5
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par Nasky
    Pourquoi ne pas placer ta boucle avant le gtk_main_quit :

    Nas'
    Cette instruction se trouve dans la fonction qui gère le bouton quitter
    Si je met ma boucle dans le code du bouton quitter, il ne sera executer que lors du clic sur ce bouton. Alors que mon programme doit etre tout le temps à l'ecoute d'un message, d'où mon probleme

  6. #6
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    En fait, la solution serait que la boucle événementielle infinie gtk_main() appelle à chaque itération mon bloc d'instruction servant à écouter sur la socket:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select(...)
    /* ... */
    if (FD_ISSET(...) )
    {
       recv( ...);
       /* ... */
    }
    /* ... */
    Comme ça pas besoin de while(1)
    Mais je ne sais si c'est possible, et si oui comment faire, car aucun événement ne serait lié à cette fonction, elle devra etre appellée à chaque fois

  7. #7
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par sorry60
    Mais je ne sais si c'est possible, et si oui comment faire, car aucun événement ne serait lié à cette fonction, elle devra etre appellée à chaque fois
    Avec un timer peut être : g_timeout_add

  8. #8
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par gege2061
    Citation Envoyé par sorry60
    Mais je ne sais si c'est possible, et si oui comment faire, car aucun événement ne serait lié à cette fonction, elle devra etre appellée à chaque fois
    Avec un timer peut être : g_timeout_add
    Ouai apparemment c'est un peu ça, je vais tester ça.
    Merci pour ton aide

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Pourquoi pas tout simplement un Thread qui s'occuperais que de cette action ?
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  10. #10
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Pourquoi se compliquer avec un thread?

    Sinon, gtk_timeout_add(x, ptr_fct,data) te permettra d'appeler une fonction toutes les x ms.
    Par contre, attention au fonctionnement de cette fonction, en particulier si elle est appelée à chaque clic sur un bouton.
    En effet, si le bouton lance cette fonction (qui lance une autre fonction) et que tu cliques plusieurs fois sur ce bouton, il va lancer plusieurs fois la fonction et donc t'auras l'impression que l'intervalle se réduit (la vitesse augmente).
    Une solution pour contrer ce problème est d'utiliser une variable qui te donne le nombre de clic (une 'static') et d'insérer les id retournés par gtk_timeout_add() et de supprimer ceux qui sont en trop avec gtk_timeout_remove(id).
    Je sais pas si t'as compris et surtout si ça te concerne, mais j'ai été un peu piégé par ça, j'ai du faire une ptite bidouille (comme expliqué) pour empêcher ça.

    Nas'

  11. #11
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par CSoldier
    Pourquoi pas tout simplement un Thread qui s'occuperais que de cette action ?
    J'essaye d'éviter le plus possible les threads, et en plus je veux un code portable windows - linux

  12. #12
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par Nasky
    Pourquoi se compliquer avec un thread?

    Sinon, gtk_timeout_add(x, ptr_fct,data) te permettra d'appeler une fonction toutes les x ms.
    Par contre, attention au fonctionnement de cette fonction, en particulier si elle est appelée à chaque clic sur un bouton.
    En effet, si le bouton lance cette fonction (qui lance une autre fonction) et que tu cliques plusieurs fois sur ce bouton, il va lancer plusieurs fois la fonction et donc t'auras l'impression que l'intervalle se réduit (la vitesse augmente).
    Une solution pour contrer ce problème est d'utiliser une variable qui te donne le nombre de clic (une 'static') et d'insérer les id retournés par gtk_timeout_add() et de supprimer ceux qui sont en trop avec gtk_timeout_remove(id).
    Je sais pas si t'as compris et surtout si ça te concerne, mais j'ai été un peu piégé par ça, j'ai du faire une ptite bidouille (comme expliqué) pour empêcher ça.

    Nas'
    non ma fonction n'est appellé par aucun événement.
    Elle doit tourner en arrière plan, comme ça des qu'un message arrive, il est réceptionné.
    C'est ma fonction d'envoie de message qui est gérée par un bouton, mais ici pas de probleme.

  13. #13
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par sorry60
    Citation Envoyé par CSoldier
    Pourquoi pas tout simplement un Thread qui s'occuperais que de cette action ?
    J'essaye d'éviter le plus possible les threads, et en plus je veux un code portable windows - linux
    p_thread est portable, mieux encore, si tu utilise GTK donc GLib obligatoirement et je crois même qu'il s'y trouve une abstraction pour les Thread, je pense que c'est le meilleur moyen pour avoir une partie d'un programme qui tourne en arriere plan et qu'il soit portable !
    Après si y'a d'autres soluces mieux adapté je connais pas, je ne donne que mon point de vue !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  14. #14
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Le timer me parait etre une bonne solution.
    Je n'ai pas encore tester, si c'est pas bon alors j'essaierai les threads

  15. #15
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    J'ai essayé ça :

    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
    void test(void)
    {
    	printf("Ok\n");
    }
     
    int main(int argc, char **argv)
    {
    	/*Déclaration des variables*/
      	GtkWidget* pFenetrePrincipale;
      	GtkWidget* pBoutonQuitter;
     
    	gtk_init(&argc, &argv);
     
    	creerFenetre(&pFenetrePrincipale,"Test",400,400);
    	creerBouton(&pBoutonQuitter,"Quitter");
    	gtk_container_add(GTK_CONTAINER(pFenetrePrincipale),GTK_WIDGET(pBoutonQuitter));
    	g_signal_connect(G_OBJECT(pBoutonQuitter),"clicked",G_CALLBACK(gtk_main_quit),NULL);
    	gtk_widget_show_all(pFenetrePrincipale);
    	g_timeout_add(1000, GSourceFunc(test),NULL);
     
    	gtk_main();
     
        return 0;
    }
    Mais j'arrive pas à compiler :
    gcc -Wall -Wextra -ansi -O2 test.c -o test `pkg-config --cflags --libs gtk+-2.0`
    test.c: In function ‘main’:
    test.c:60: erreur: syntax error before ‘GSourceFunc’
    Je vois pas où est l'erreur de syntaxe
    Suis-je aveugle ?

  16. #16
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    La syntaxe était :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_timeout_add(1000,(GSourceFunc)test,NULL);
    Ca l'air de bien fonctionner, il m'affiche "OK" toutes les secondes, et quitte bien quand je clic sur le bouton

  17. #17
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par sorry60
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_timeout_add(1000, GSourceFunc(test),NULL);
    Il est temps de réviser le chapitre du transcriptage!

    Et aussi de lire la dic : GSourceFunc à pour définition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gboolean (*GSourceFunc)  (gpointer data);
    et non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void (*GSourceFunc)  (void);

  18. #18
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Ce n'est pas la bonne synthaxe, sorry60.

    Petit rappel du fonctionnement de gtk_timeout_add().
    Par l'intérmédiaire d'un pointeur sur fonction, elle appelle cette fonction à intervalle régulier.
    La fonction à appeler a le prototype suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gboolean test(gpointer data);
    Le deuxième paramètre de gtk_timeout_add() est juste un pointeur sur fonction du type de test(). Tu peux donc l'appeler comme tu veux.
    De plus, la fonction appelée par gtk_timeout_add() doit renvoyer un boolean pour dire si on l'exécute ou pas. Si elle renvoie TRUE, on l'exécute. Si elle renvoie FALSE, on arrête l'exécution.
    Exemple d'utilisation :
    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
    gboolean (*ptr_fct) (gpointer data) ; // pointeur sur fonction
    ptr_fct = test ; // pointe sur la fonction test() pour pouvoir l'appeler
    gtk_timeout_add(1000,ptr_fct,NULL); // appel toutes les secondes de la fonction pointée par ptr_fct à savoir test()
     
    // fonction test
    gboolean test(gpointer data)
    {
       static int times = 0 ; // nombre d'appel à la fonction
       gboolean ret = TRUE ; // continuer ou pas
       times++ ; 
       // appeler que 10 fois la fonction
       if(times > 10)
       {
           ret = FASLE ; // arreter
       }
     
    return ret ;
    }
    Après 10 appels, gtk_timeout_add() arrêtera d'appeler la fonction.

    J'espère que c'est plus clair

    Nas'

  19. #19
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_timeout_add(1000,(GSourceFunc)test,NULL);
    Marche tres bien, c'est pas bon ?

Discussions similaires

  1. [Boucle Infinie] pour un menu
    Par NhyMbuS dans le forum C++
    Réponses: 5
    Dernier message: 20/07/2005, 09h14
  2. symptome de la boucle infinie dans une requete
    Par ouam81 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/05/2005, 12h10
  3. Réponses: 15
    Dernier message: 24/05/2005, 08h34
  4. [Socket] Pb de boucle infinie
    Par Myogtha dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 10/06/2004, 14h10
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

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