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+ Discussion :

Affichage double avec 2 idle_add distinct.


Sujet :

GTK+

  1. #1
    Invité
    Invité(e)
    Par défaut Affichage double avec 2 idle_add distinct.
    Bonjour,

    J'exécute deux idel_add pour afficher deux texte distincts, mais j'obtiens deux fois le même texte.

    Sauriez vous d'où peut provenir le problème ?

    Merci
    Dernière modification par Invité ; 30/12/2012 à 22h19.

  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
    Sans code, ça va être dûr de t'aider...
    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
    Invité
    Invité(e)
    Par défaut
    Ok, merci déjà !


    Dans une tache j'appelle l'entrée Start :
    Code ada : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    --
               accept Start do
                   Hmi.Text_Message := new String ' ("Phoebus Start");
                   Idle_ID := Text_Idle.Idle_Add (Idle_Text'Access, Hmi.all'access);
                   Hmi.BandMaster.Start;
                end Start;

    Et dans la tache BandMaster après le start, je refait un idle_add
    Code ada : 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
     
    --
             case The_Part.Mode is
                   when Fusion | Fission =>
                      Hmi.Text_Message := new String ' ("Loading part: " &
                                                          Mode_Type'Image(The_Part.Mode) &
                                                          Positive'Image(The_Part.Last+1) &
                                                          Tempo_Type'Image(The_Part.Tempo) &
                                                          Character'Val(9) & Form_Type'Image(The_Part.Initial_Form) &
                                                          " " & Form_Type'Image(The_Part.Terminal_Form));
                   when others =>
                      Hmi.Text_Message := new String ' ("Loading part: " &
                                                          Mode_Type'Image(The_Part.Mode) &
                                                          Positive'Image(The_Part.Last+1) &
                                                          Tempo_Type'Image(The_Part.Tempo) &
                                                          Character'Val(9) & Form_Type'Image(The_Part.Initial_Form));
     
                end case;
     
     
     
                Idle_ID := Text_Idle.Idle_Add (Idle_Text'Access, Hmi.all'access);

    Mais j'ai deux fois la ligne "Loading Part..."

    Au lieu d'avoir une fois Start et une fois Loading Part.

    Merci si tu peux m'aider.

  4. #4
    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
    J'essaie de décoder ça, mais GtkAda, ce n'est clairement pas ma tasse de thé... Il me semble toutefois que tu fais un premier appel à idle_add après avoir initialisé ton message à afficher, puis tu changes ce message et refais un appel à idle_add. Or tu n'as aucune garantie que la première callback a été appelée (et je pense que ce n'est pas le cas, vu que tu ne rends pas la main à GTK). Appeler idle_add ne fait que rajouter un messages dans la pile des messages de GTK.

    1. tu initialises ton texte à "Phoebus Start"
    2. tu appelles idle_add qui ajoute un message dans la pile des messages
    3. tu changes ton texte en "Loading Part: ..."
    4. tu appelles idle_add qui ajoute un message dans la pile des messages
    5. tu rends la main à GTK
    6. GTK dépile les messages et appelle ta callback d'affichage une première fois
    7. GTK dépile les messages et appelle ta callback d'affichage une seconde fois

    Le texte a donc déjà changé quand ta callback est appelée...
    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)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci liberforce.

    C'est ça, et est-ce qu'il y a moyen de forcer Gtk à exécuter le premier idle_add avant que je change le texte ?

  6. #6
    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
    Si il y a un moyen, mais pourquoi passes tu par un idle_add pour faire ça ? Tu ne peux pas appeler directement ta fonction ? Tu es dans un thread ?

    Pour forcer un vidage de la pile des messages, en C, on utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (gtk_events_pending ())
      gtk_main_iteration ();
    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)

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par liberforce Voir le message
    Si il y a un moyen, mais pourquoi passes tu par un idle_add pour faire ça ? Tu ne peux pas appeler directement ta fonction ? Tu es dans un thread ?

    Pour forcer un vidage de la pile des messages, en C, on utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (gtk_events_pending ())
      gtk_main_iteration ();
    Oui je suis dans une tache externe au processus Gtk.

    Je vais essayer la boucle.

  8. #8
    Invité
    Invité(e)
    Par défaut
    J'ai modifier l'implémentation de l'entée Start,

    Code ada : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    --
                accept Start do
                   Hmi.Text_Message := new String ' ("Phoebus Start");
                   Idle_ID := Text_Idle.Idle_Add (Idle_Text'Access, Hmi.all'access);
                   while (Events_Pending) loop
                      if Main_Iteration then
                         null;
                      end if;
                   end loop;
                   Hmi.BandMaster.Start;
                end Start;

    Ca ne fonctionne pas chez moi.
    Je vais faire autrement pour que ça reste joli.

Discussions similaires

  1. Réponses: 14
    Dernier message: 14/10/2014, 13h42
  2. Réponses: 0
    Dernier message: 23/11/2010, 10h46
  3. [MySQL] Problème récupération de données avec un SELECT DISTINCT
    Par 12_darte_12 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/07/2005, 14h48
  4. Affichage Données avec Espace ds Zone Texte
    Par dai.kaioh dans le forum ASP
    Réponses: 2
    Dernier message: 22/02/2005, 16h43
  5. Affichage graphe avec DBChart
    Par grominetos dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/06/2004, 19h17

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