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 :

Barre de progression.


Sujet :

GTK+ avec C & C++

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

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 56
    Points : 48
    Points
    48
    Par défaut 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é
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    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.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 56
    Points : 48
    Points
    48
    Par défaut
    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é
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    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é

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    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é
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    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/sta...events-pending

  7. #7
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    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...

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

Discussions similaires

  1. Indy FTP (idFTP) faire une barre de progress de transfert
    Par Harry dans le forum Web & réseau
    Réponses: 4
    Dernier message: 09/07/2004, 13h15
  2. [VB.NET] Pb avec le bouton Annuler d'1 barre de progression
    Par dada1982 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/06/2004, 09h56
  3. Réponses: 12
    Dernier message: 27/05/2004, 00h13
  4. [DEBUTANT] Barre de progression
    Par pupupu dans le forum MFC
    Réponses: 4
    Dernier message: 18/01/2004, 16h47
  5. [web] Barre de Progression ASCII
    Par Red Bull dans le forum Web
    Réponses: 13
    Dernier message: 05/06/2003, 12h56

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