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 :

Rafraichissement de fenêtre GTK+


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2009
    Messages : 61
    Points : 54
    Points
    54
    Par défaut Rafraichissement de fenêtre GTK+
    Bonjour,

    je développe une application scientifique et je rencontre un problème de rafraichissement de fenêtre.
    Avant de lancer un calcul (couteux en temps CPU) je crée et lance une fenêtre pop-up qui doit dire à l'utilisateur 'Calcul en cours'.
    Tout semble fonctionner, la fenêtre s'ouvre et disparaît une fois le calcul terminé .. le problème rien ne s'affiche dans celle ci.

    Voici le code que j'utilise pour créer ma fenêtre pop-up:
    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
    GtkWidget * show_pop (char * pop, GtkWidget * pwin)
    {
      GtkWidget * wpop;
      GtkWidget * label;
      GtkWidget * hpop;
      GtkWidget * imgpop;
     
      wpop = gtk_window_new(GTK_WINDOW_TOPLEVEL);
      gtk_widget_set_size_request (wpop, 600, 80);
      gtk_window_set_position (GTK_WINDOW (wpop), GTK_WIN_POS_CENTER);
      gtk_window_set_resizable (GTK_WINDOW (wpop), FALSE);
      gtk_window_set_transient_for (GTK_WINDOW (wpop), GTK_WINDOW (pwin));
      gtk_window_set_title(GTK_WINDOW(wpop), "Information");
     
      hpop = gtk_hbox_new (FALSE, 0);
      gtk_widget_show (hpop);
      gtk_container_add (GTK_CONTAINER (wpop), hpop);
      imgpop = gtk_image_new_from_stock ("gtk-execute", GTK_ICON_SIZE_BUTTON);
    //  gtk_widget_set_size_request (imgpop, 20, 20);
      gtk_widget_show (imgpop);
      gtk_box_pack_start (GTK_BOX (hpop), imgpop, TRUE, TRUE, 0);
      label = gtk_label_new (pop);
      gtk_widget_show (label);
      gtk_box_pack_start (GTK_BOX (hpop), label, TRUE, TRUE, 0);
     
      return (wpop);
    }
    et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ... 
    pop=show_pop ("Calculation in progress", win);
    gtk_widget_show_all(pop);
    ...
    Dans cet exemple je ne traite qu'une seule configuration (mon programme peut en traiter plusieurs peu importe ce qu'est une configuration).
    Dans le cas où je traite plusieurs configurations je créer la même fenêtre pop-up en incluant cette fois une barre de défilement qui se remplie
    en fonction du traitement des configurations ... dans ce 2ème cas tout fonctionne parfaitement et toutes les informations sont affichées.
    Dans le cas de la barre de défilement j'utilise la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (gtk_events_pending()) gtk_main_iteration();
    Pour rafraîchir, actualiser l'affichage de la fenêtre.

    J'ai essayé d'appliquer la même technique dans le premier cas (pour lequel je souhaite simplement notifier l'utilisateur qu'un calcul est en cours
    et dans lequel j'ai uniquement enlevé la barre de défilement).
    Cependant impossible d'afficher un label ou une image dans cette fenêtre pour ce cas apparemment plus simple (sans barre de défilement).
    La fenêtre est bien créée mais rien n'y figure ... et rien ne change en essayant de rafraîchir l'affichage GTK+ à l'aide de la fonction gtk_main_iteration().

    Une suggestion ?

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Bonjour,
    est-ce que ton calcul est long ? Car sache que ton problème vient de la pompe à évènement. Tout ton programme s'exécute dans un seul thread. Ce qui veut dire que tant que tu gardes la main et ne la rends pas à la pompe à évènement (c'est à dire tant que tu exécutes du code à toi dans une callback), GTK ne peut rien faire, il ne peut pas réagir aux évènement... dont ceux qui lui permettent de rafraichir l'interface graphique. D'où l'utilité des appels à gtk_main_iteration. Mais si ton calcul met du temps à s'exécuter, si tu n'appelles gtk_main_iteration qu'avant ou après ton traitement, ça ne peut pas fonctionner.

    Plusieurs solutions :
    Découper ton traitement en plusieurs morceaux, et rendre la main à GTK+ entre chaque morceau (avec un automate pour choisir la partie à exécuter), ou bien appeler utiliser un worker thread, c'est un dire un thread qui fait le traitement. Ainsi le traitement peut être aussi long que tu le désires, il ne bloquera pas le thread principal qui raffraichit l'interface graphique. Les opérations portant sur l'interface graphique ne doivent se faire que dans le thread principal par contre, car GTK+ n'est pas thread-safe. Ou presque. Dans ton cas, si le traitement n'a rien de graphique, je te conseillerais de créer un thread, mais dans des cas plus complexe, il vaut mieux éviter au maximum les threads, parce que cela devient difficile à déboguer ensuite.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  3. #3
    Membre du Club
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2009
    Messages : 61
    Points : 54
    Points
    54
    Par défaut
    Merci beaucoup pour toutes ces précisions.
    Je ne sais pas encore ce que je vais faire mais maintenant je suis informé.

    Le calcul est long et je pensais quand lançant la fenêtre avant le calcul je verrais tout s'afficher normalement.

    Encore merci.

Discussions similaires

  1. Rafraichissement fenêtre GTK
    Par quentennis dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 05/05/2008, 16h13
  2. [SWING] Rafraichissement de fenêtre
    Par Lambrosx dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 17/01/2008, 08h57
  3. Lancer une application depuis une fenêtre gtk
    Par cyrilleG dans le forum GTK+ avec Python
    Réponses: 11
    Dernier message: 29/09/2007, 22h03
  4. Commander des fenêtres GTK avec le shell
    Par clebig dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 31/07/2006, 11h58
  5. perte de dessin lors du rafraichissement de fenètre
    Par tawsi dans le forum Graphisme
    Réponses: 1
    Dernier message: 04/06/2006, 07h38

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