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 :

Problème de boucle


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 204
    Par défaut Problème de boucle
    Bonjour à tous et à toutes !!!!!
    Je suis en train de créer un programme avec lequel j'inclus un lecteur musique et c'est pour cela que j'utilise FMOD.
    Mon lecteur marche très bien mais il y a quand même un problème : mon programme ne veut plus executer d'autres fonctions !!!
    Par exemple j'ai une fonction quio demande si l'on veut quitter le programme. Si l'on clique OUI, le prog. ferme (gtk_main_quit) et sinon il detruit la boite de dialogue normalement. Et beh quand le lecteur joue le prog. veut pas fermer...
    Ou alors j'utilise des scrollbar à un textview et lorsque le lecteur joue et que j'insere un très long texte, le scrollbarre n'augmente pas, comme si j'avais rien mis comme texte...
    Ce ne sont pas les seuls exemples mais ceux qui m'embete le plus quand le lecteur joue ...
    Pour FMOD je suis obligé d'utiliser une boucle qui bloque mon programme si je n'inclus pas "gtk_main_iteration();"

    Voici mon code :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
         while(Chanson_courante <= g_list_length(Liste_musique) && Stop == FALSE)
         {
              FSOUND_Init(44100, 32, 0); 
              FSOUND_SetVolume(FSOUND_ALL, 255);
              FSOUND_STREAM *Musique = NULL;
              gchar* Message, *Temp;
              Message = (gchar *) g_list_nth_data(Liste_musique, Chanson_courante-1);
              Temp = g_locale_from_utf8( str_replace(Message, "\\", "\\\\"), -1, NULL, NULL, NULL);
              gtk_main_iteration();
              Musique = FSOUND_Stream_Open(g_strdup(Temp), 0, 0, 0);//g_strdup(str_replace(Message, "\\", "\\\\")), 0, 0, 0);
     
             if(Musique != NULL)
              {
     
                   FSOUND_Stream_Play(FSOUND_FREE, Musique);                  
     
                   i = 0, y = 0;
                   y = FSOUND_Stream_GetLengthMs(Musique);
     
     
                    while(i < y && Stop == FALSE)
                   {     
                         i = FSOUND_Stream_GetTime(Musique);
                         Fraction = (gdouble)i / (gdouble)y;
                         gtk_progress_bar_set_text(GTK_PROGRESS_BAR(data), g_strdup_printf("%s - %s / %s", g_path_get_basename(Message), MiseForme_Heure(i), MiseForme_Heure(y))); 
                         gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(data), Fraction);                  
                         gtk_main_iteration();     
                   }
     
                   FSOUND_Stream_Close(Musique);             
                   Chanson_courante++;       
     
               }
     
               else
               {
     
                   GtkWidget *Dialogue;
                   Dialogue = gtk_message_dialog_new(NULL,
                                                     GTK_DIALOG_MODAL,
                                                     GTK_MESSAGE_WARNING,
                                                     GTK_BUTTONS_OK,
                                                     g_locale_to_utf8("Le lecteur musique ne peut pas joué la musique suivante. Cette musique n'est probablement pas au bon format ou bien elle a été déplacé ou supprimé !\nVoici le repertoire de destination que nous avons dans nos fichiers : \n%s", -1, NULL, NULL, NULL), Message);    
                   gdk_beep();
                   gtk_dialog_run(GTK_DIALOG(Dialogue));
                   gtk_widget_destroy(Dialogue);
     
                   FSOUND_Stream_Close(Musique); 
                   Chanson_courante++;
               }      
           gtk_progress_bar_set_text(GTK_PROGRESS_BAR(data), ""); 
           gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(data), (gdouble) 0); 
     
           }
    str_replace est une fonction que j'ai inventé
    Liste_Musique, Stop et Chanson_courante sont des variables statiques qui servent à mon lecteur

    Vola j'espere que vous pourrez m'aider !!!!
    Merci d'avance pour vos réponses ^^

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 204
    Par défaut
    J'ai regardé la DOC et j'ai vu une fonction intéressante : gtk_main_iteration_do(gboolean *variable);

    Elle fait la même que gtk_main_iteration(void); sauf qu'elle ne bloque pas les autres fonctions si j'ai bien compris...
    J'ai testé mais cela ne marche toujours pas...
    Mon lecteur musique bloque toutes les autre fonctions tels que gtk_main_quit();

    Merci d'avance pour votre aide

  3. #3
    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
    T'as des fonctions de FMOD_ qui doivent mettre longtemps à s'éxécuter non ? Sinon, un petit truc, l'appel à gtk_main_iteration se fait de la façon suivante en général:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while (gtk_events_pending ())
    	  gtk_main_iteration ();

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 204
    Par défaut
    T'as des fonctions de FMOD_ qui doivent mettre longtemps à s'éxécuter non ? Sinon, un petit truc, l'appel à gtk_main_iteration se fait de la façon suivante en général:
    Code :

    while (gtk_events_pending ()) gtk_main_iteration ();
    Mince je croyais que gtk_events_pending cela servait à rien ^^ (je me disais auss à quoi sa servait... et je me le demande toujours )

    Disons que si j'utilise FMOD c'est pour lire des chansons qu'une personne choisit. Mon logiciel n'est pas un lecteur musique. C'est juste un p'tit truc que j'ai rajouté si il y en a que ca intéresse ^^



    PS : voici mon nouveau code :


    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
         if(g_list_length(Liste_musique) != 0 && (Chanson_courante-1) != -1)
         {
     
             gint i = 0, y = 0;
             gdouble Fraction;
             Stop = FALSE;
     
             while(Chanson_courante <= g_list_length(Liste_musique) && Stop == FALSE)
             {
              FSOUND_Init(44100, 32, 0); 
              FSOUND_SetVolume(FSOUND_ALL, 255);
              FSOUND_STREAM *Musique = NULL;
              gchar* Message, *Temp;
              Message = (gchar *) g_list_nth_data(Liste_musique, Chanson_courante-1);
              Temp = g_locale_from_utf8( str_replace(Message, "\\", "\\\\"), -1, NULL, NULL, NULL);
              Musique = FSOUND_Stream_Open(g_strdup(Temp), 0, 0, 0);
     
             if(Musique != NULL)
              {
     
                   FSOUND_Stream_Play(FSOUND_FREE, Musique);                  
     
                   i = 0, y = 0;
                   y = FSOUND_Stream_GetLengthMs(Musique);
     
     
                    while(i < y && Stop == FALSE & gtk_events_pending ())
                   {    
                         gtk_main_iteration_do(FALSE);    
                         i = FSOUND_Stream_GetTime(Musique);
                         Fraction = (gdouble)i / (gdouble)y;
                         gtk_progress_bar_set_text(GTK_PROGRESS_BAR(data), g_strdup_printf("%s - %s / %s", g_path_get_basename(Message), MiseForme_Heure(i), MiseForme_Heure(y))); 
                         gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(data), Fraction);                        
                   }
     
                   FSOUND_Stream_Close(Musique);             
                   Chanson_courante++;       
     
               }
     
               else
               {
     
                   GtkWidget *Dialogue;
                   Dialogue = gtk_message_dialog_new(NULL,
                                                     GTK_DIALOG_MODAL,
                                                     GTK_MESSAGE_WARNING,
                                                     GTK_BUTTONS_OK,
                                                     g_locale_to_utf8("Le lecteur musique ne peut pas joué la musique suivante. Cette musique n'est probablement pas au bon format ou bien elle a été déplacé ou supprimé !\nVoici le repertoire de destination que nous avons dans nos fichiers : \n%s", -1, NULL, NULL, NULL), Message);    
                   gdk_beep();
                   gtk_dialog_run(GTK_DIALOG(Dialogue));
                   gtk_widget_destroy(Dialogue);
     
                   FSOUND_Stream_Close(Musique); 
                   Chanson_courante++;
               }      
           gtk_progress_bar_set_text(GTK_PROGRESS_BAR(data), ""); 
           gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(data), (gdouble) 0); 
     
           }
     
           Stop_musique(NULL, data);
     
     
       }
    Cela ne marhce toujours pas !!!!
    Cependant lorsque j'appuie sur STOP et que la boucle prend donc fin, le programme se coupe d'un coup, seulement si j'ai appyer sur le oui de quitter.
    C'est un peu dur à expliquer donc je comprendrai que vous ne compreniez rien ^^

  5. #5
    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
    Citation Envoyé par mick009
    Cependant lorsque j'appuie sur STOP et que la boucle prend donc fin, le programme se coupe d'un coup, seulement si j'ai appyer sur le oui de quitter.
    Ca semble indiquer qu'il y a une des fonctions de FMOD que tu appelles qui rend seulement la main quand tu arrêtes la lecture de la musique, non ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 204
    Par défaut
    Une fonction du genre ?????

    Je pensais plus à la boucle. Elle est executé jusqu'à que la musique s'arrête. Comme elle va très vite, la main n'a pas le temps de recevoir d'autres messages.

    Dites le moi si je raconte n'importe quoi !!!!

  7. #7
    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
    Si t'as des appels à gtk_main_iteration dans la boucle la plus interne qui joue la musique, ça n edevrait pas poser de pb.

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 204
    Par défaut
    Si t'as des appels à gtk_main_iteration dans la boucle la plus interne qui joue la musique, ça n edevrait pas poser de pb.
    Je confirme : en effet ca ne devrais pas me poser de pb

  9. #9
    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
    Je répondais juste à ton histoire de boucles là...
    Par contre si FSOUND_Stream_Play(FSOUND_FREE, Musique); ou bien FSOUND_Stream_GetTime(Musique); prennent qques secondes à s'exécuter, ça va poser pb

  10. #10
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 204
    Par défaut
    Qu'est-ce que ca fait si ils mettent quelques secondes à s'éxécuter ?
    De toute façon mon problème est que à cause de cette boucle mon programme ne veut plus recevoir d'autres réponses...
    C'est pas normal !!!!!!!!!!!!!!!

  11. #11
    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
    Si ta fonction bloque pdt N secondes, ça fait N secondes où gtk+ est dans l'incapacité totale de traiter les évènements (rafraichissement des fenêtres, gestion des clics, ...), donc c'est parfaitement normal que ton interface semble bloquée et que tout redémarre une fois que la fonction se termine.
    Je dis pas que c'est la raison qui fait que ton programme marche mal, c'est une possibilité, et y a qu'une personne qui peut confirmer ou infirmer cette hypothèse, c'est toi.

  12. #12
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 204
    Par défaut
    Oki, je vais rempplacer ce qu'il y a dans la boucle

  13. #13
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 204
    Par défaut
    Je dis pas que c'est la raison qui fait que ton programme marche mal, c'est une possibilité, et y a qu'une personne qui peut confirmer ou infirmer cette hypothèse, c'est toi.
    Tout à fait d'accord !!!!!!!

    Merci beaucoup !!! C'était bien cela !!!! Même si je n'ai pas compris pourquoi si l'opération dure quelques secondes à s'éxecuter, cela ne marche pas !!!!

    Voici la fonction qui causait des problèmes :

    gtk_progress_bar_set_text(GtkProgressBar *ProgressBar, gchar *text);
    Mais comment je peux faire ???? (C'est pour + d'ésthétisme !!!!!! (dsl, je ne sais pas comment ca s'écrit ))

    Merci d'avance pour votre réponse

  14. #14
    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
    Hmm, t'es certain que c'était bien ça ? Suis en train de me demander si au contraire t'appelait pas gtk_progress_bar beaucoup trop souvent (genre 10000 fois par seconde). Une idée sur la question ?

  15. #15
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 204
    Par défaut
    Beh, quand je mets la fonction en commentaire ( // ), le programme ne pose pas de problème. J'ai même essayé de changer la phrase que je mettais dans le progressbar par rien ( "" ), et ca m'a fait le même problème ...


    Hmm, t'es certain que c'était bien ça ? Suis en train de me demander si au contraire t'appelait pas gtk_progress_bar beaucoup trop souvent (genre 10000 fois par seconde). Une idée sur la question ?
    Et si je l'appele trop souvent... C'est la seule fonction qui se sert du progressbar...

  16. #16
    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
    Si tu l'appelles trop souvent et que gtk+ essaie de mettre à jour la progress bar 100000 fois par seconde, ça va faire ramer tout le reste... Et ce que tu décris, ça me donne cette impression là. Mais comme je l'ai déjà dit, tu es le seul à pouvoir confirmer/infirmer ces hypothèses, compter le nb de fois où gtk_set_progress_bar est appelé par seconde, ça me paraît plutôt simple à faire...

  17. #17
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 204
    Par défaut
    et comment j'peux faire pour compter cela ??
    De plus,même si je savais cb ca fait de fois par seconde, en quoi cela m'avancerait - il ????

  18. #18
    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
    Citation Envoyé par mick009
    et comment j'peux faire pour compter cela ??
    Avec un code de ce style (pas testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    GTimeVal cur_time;
    glong last_time = 0;
    glong loop_count = 0;
    while (TRUE) {
        loop_count++;
        g_get_current_time (&cur_time);
        if (cur_time.tv_sec > last_time) {
             g_print ("%d passages dans la boucle par seconde\n", loop_count);
             last_time = cur_time.tv_sec;
             loop_count = 0;
        }
    }
    Citation Envoyé par mick009
    De plus,même si je savais cb ca fait de fois par seconde, en quoi cela m'avancerait - il ????
    Tout simplement à être certain de ce qui se passe au lieu de faire "ah bah c'est peut être ça, ou ça, par contre quand je fais ça au pif, je comprends pas du tout pourquoi mais ça aide, donc au final c'est peut être dû à tel autre truc".

  19. #19
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 204
    Par défaut
    J'ai pluttôt fait avec les timer (que le glib nous propose) !!!
    Voici le code avec les timers :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while(i < y && Stop == FALSE)
                   {     timer =  g_timer_new();g_timer_start (timer);
                         i = FSOUND_Stream_GetTime(Musique);
                         Fraction = (gdouble)i / (gdouble)y;
                         Format_time = g_strdup_printf("%s - %s / %s", g_path_get_basename(Message), MiseForme_Heure(i), MiseForme_Heure(y));
                         gtk_progress_bar_set_text(GTK_PROGRESS_BAR(data), g_locale_to_utf8("", -1, NULL, NULL, NULL)); 
                         gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(data), Fraction); 
                         gtk_main_iteration_do(FALSE);           
                         g_timer_stop (timer);             printf("Temps ecoule : %d\n", g_timer_elapsed (timer, NULL));
                         g_timer_reset(timer);
     }
    Timer a été défini plus haut

    Voici les résultats (qui varient il faut dire) :

    Avec la fonction gtk_progress_bar_set_text(GtkProgressBar *ProgressBar, gchar *text); :

    En moyenne (qui apparait le plus souvent ) : 65640844 (il paraît que c'est en secondes mais c'est un peu bizarre dans ce cas la !!!!!!
    Desfois, il me met 0, Desfois, 98461266 (sc)...

    Sans la fonction, il me met beaucoup de zéro. Desfois des 65640844.

    Cela ne m'avance pas plus....

    Ensuite , j'ai eu l'idée de tester la fonction toute seule (gtk_progress_bar_set_text). Cela m'a donné pleins de zéro (sc), et de temps en temps des 65640844

  20. #20
    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
    Mouais, je suis pas sûr que t'auras une résolution suffisante avec les gtimer pour mesurer la durée d'un tour de boucle. g_timer_elapsed ça renvoie un nombre flottant de type gdouble, pas un entier...

Discussions similaires

  1. Problème de boucles imbriquées
    Par Gnux dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 09/12/2005, 20h26
  2. [Tableaux] Problème avec boucle
    Par MYster dans le forum Langage
    Réponses: 6
    Dernier message: 11/11/2005, 18h39
  3. Problème de boucle
    Par TheUltimaSephiroth dans le forum C
    Réponses: 8
    Dernier message: 10/10/2005, 13h58
  4. Problème de boucle
    Par Louis-Guillaume Morand dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/09/2005, 09h10
  5. Problème de boucle
    Par basclln dans le forum C++
    Réponses: 19
    Dernier message: 02/04/2005, 09h13

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