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
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.
Sans code, ça va être dûr de t'aider...
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.
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.
- tu initialises ton texte à "Phoebus Start"
- tu appelles idle_add qui ajoute un message dans la pile des messages
- tu changes ton texte en "Loading Part: ..."
- tu appelles idle_add qui ajoute un message dans la pile des messages
- tu rends la main à GTK
- GTK dépile les messages et appelle ta callback d'affichage une première fois
- 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...
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 ?
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 ();
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager