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 :

Barre de progression.


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Barre de progression.
    Bonjour,

    Les tutoriaux que j'ai trouvé utilisent tous un timer qui apelle une fonction a intervalle donné pour faire défiler la barre de progression. Mais j'aimerai la faire défiler la barre d'une autre façon, avec la fonction sleep (ou Sleep pour MinGW) et une fonction qui est éventuellement un thread.

    Si quelqu'un peu m'écrire un code simple en langage C, d'une fenêtre avec une barre de progression qui se met à progresser quand on clique sur un bouton. Le bouton déclenchant éventuellement un thread qui fait progresser la barre avec la fonction sleep/Sleep pour les intervales de temps.

    Ce que je cherche à faire précisément c'est de faire défiler la barre en fonction de l'avancement de la lecture d'un fichier.

  2. #2
    Expert confirmé
    Lancer un thread indépendant de la boucle GTK est le meilleur moyen de se retrouver avec une application instable. Si tu peux accéder à la quantité de données chargée en temps réel la fonction gtk_progress_bar_set_fraction(); peut être appelée à la volée.
    Utilisation de Glade avec Gtk+ - N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk

  3. #3
    Membre du Club
    Le problème c'est qu’apparemment, d'après les tests que j'ai fait, GTK ne met pas à jour la barre pendant l'exécution du callback, donc je ne voit pas comment faire autrement qu'avec un thread.

    J'ai finalement réussit à utiliser une barre de progression, mais avec un thread et une fonction de timeout, appelée automatiquement à intervales donnés, ajoutée avec g_timeout_add(). La fonction de timeout observe une variable globale qui contient l'avancement de la progression, et met à jour la barre de progression avec gtk_progress_set_value().

    Apparement, il n'y a pas de fonction pour supprimer une fonction de timeout ?

  4. #4
    Expert confirmé
    Il suffit que le callback attaché à la boucle principale avec la fonction g_timeout_add(); renvoie FALSE pour l'arrêter

    L'utilisation des variables globales n'est, en général, pas vraiment une bonne chose, même si cela n'est pas interdit par le langage. La fonction callback peut recevoir une donnée en paramètre. Ne peux-tu pas l'utiliser pour éviter cette variable globale ?

    Pour finir tu dis utiliser un thread avec la fonction g_timeout_add();. Ce n'est pas tout à fait vrai au sens propre du terme. Mais ta solution est la bonne pour le problème posé
    Utilisation de Glade avec Gtk+ - N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk

  5. #5
    Rédacteur/Modérateur

    Bonsoir

    J'ai un problème équivalent, mais, je n'aimerai pas utiliser de thread. Voici un extrait de 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
                p_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
                gtk_window_set_default_size(GTK_WINDOW(p_dialog), 320, 200);
                gtk_container_set_border_width(GTK_CONTAINER(p_dialog), 4);
                barre=gtk_progress_bar_new();
                gtk_box_pack_start(GTK_BOX(pMainVBox), barre, TRUE, FALSE, 0);
                gtk_grab_add(p_dialog);
                gtk_widget_show_all(p_dialog);
     
                for (niv=0;niv<9;niv++)
                {
                    sprintf(ch,"chargement du niveau %hu",niv+1);
                    gtk_window_set_title(GTK_WINDOW(p_dialog), ch);
                    gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(barre), (float)niv/9.);
                    gtk_main_iteration ();
                    [...]
                }
                gtk_window_set_title(GTK_WINDOW(p_dialog),"mise à jour");
                gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(barre), 0.9);
                gtk_main_iteration ();
                [...]
                gtk_widget_destroy(p_dialog)


    Le problème, c'est que je ne vois même pas la fenêtre p_dialog apparaître alors que l'attente dure... longtemps...
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Expert confirmé
    gtk_main_iteration (); utilisée seule n'apportera pas la solution.

    Il faut vérifier si dans la boucle principale Gtk+ il ne reste pas quelque chose à faire avant de rendre la main.

    La solution se trouve dans le lien suivant. Il donne un exemple d'utilisation :
    https://developer.gnome.org/gtk3/stable/gtk3-General.html#gtk-events-pending
    Utilisation de Glade avec Gtk+ - N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk

  7. #7
    Rédacteur/Modérateur

    Avec ça, j'ai juste le temps de voir changer le titre de ma fenêtre, mais la barre de progression n'apparait même pas... Finalement, je trouve que c'est lent, mais ça va tout de même assez vite.
    le mieux serait d’accélérer le processus : je suis en train d'y penser !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...