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

wxWidgets Discussion :

wxTextXtrl n'affiche pas à fur et mesure ?


Sujet :

wxWidgets

  1. #1
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut wxTextXtrl n'affiche pas à fur et mesure ?
    Bonjour,

    Ne peut-on écrire dans un wxTextCtrl à fur et mesure ?

    Voici ce qui ce passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    *TextCtrl1 << wxT("Hello, I'll clear the text within 10 sec. !")<<wxT("\n");
    sleep(10);  // afin de voire que la ligne est bien affichée et ensuite supprimée
    .....
    TextCtrl1->Clear();
    for(int i=0; i<5; i++)
    *TextCtrl1 << wxT("Hello, World!")<<wxT("\n");
    La première ligne ne s'affiche pas . Cette ligne aurait-elle donc été porté en mémoire, ensuite été supprimée dans cette mémoire, ensuite les 5 Hello, World écrite en mémoire et ensuite seulement affiché ce qui reste en mémoire. C.à.d. les 5 Hello, World. ??

  2. #2
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Bonjour,
    Désolé, je ne comprend pas la question..
    J'ai l'impression que vous expliquez le comportement normal de ce qui est écrit, mais vous attendez quelque chose d'autre... Quel comportement souhaiteriez-vous?

  3. #3
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut
    Je me suis peut-être mal expliqué...

    Dans une wxTextCtrl je mets un texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *TextCtrl1 << wxT("Hello, I'll clear the text within 10 sec. !")<<wxT("\n");
    sleep(10);
    donc ce texte doit être affiché n'est-ce pas ?
    J'attends donc 10 secondes et ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TextCtrl1->Clear();
    for(int i=0; i<5; i++)
    *TextCtrl1 << wxT("Hello, World!")<<wxT("\n");
    j'efface le premier texte et je remets un nouveau (5x).

    Résultat:
    Le premier texte qui aurait dû s'afficher pendant 10 secondes n'a jamais été affiché.
    C'est uniquement le deuxième texte (5x) qui est affiché.

  4. #4
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Oui c'est "logique" car il n'y a qu'un seul et unique Thread.

    Donc le message est envoyé, et ensuite l'application dort pendant 10 secondes (donc rien ne se passe) ensuite on réveille l'application, cela efface le contenu de la ctrlist et rien ne s'est affiché.

    Pour forcer le rafraichissement il faut appeler wxYieldIfNeeded() de temps en temps.
    L’autre solution est de créer un thread, le GUI se mettra à jour tout seul, mais il faut mutexer les appels au GUI.
    Donc utiliser "wxMutexGuiEnter" et "wxMutexGuiLeave" avant et après un appel à "TextCtrl1"
    http://docs.wxwidgets.org/stable/wx_...xmutexguienter

  5. #5
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par Ti-R Voir le message
    Oui c'est "logique" car il n'y a qu'un seul et unique Thread.
    Donc le message est envoyé, et ensuite l'application dort pendant 10 secondes (donc rien ne se passe) ensuite on réveille l'application, cela efface le contenu de la ctrlist et rien ne s'est affiché.
    Si le message est envoyé, il doit être affiché, non ? le widget doit être là avec le message mais arrêté.
    Le sleep() n'arrête pas ce qui précède mais ce qui va suivre ?

    Il n'y a aucune incidence de ce genre pour le même programme en console.

  6. #6
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut
    Merciiiiii, ta suggestion a fait l'affaire.
    wxYieldIfNeeded() ;
    J'ai pas retrouvé cette fonction, ni dans mon bouquin

  7. #7
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut
    Mais j'ai trouvé mieux vu que wxwidgets déconseille d'utiliser les 'Yield'.


  8. #8
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    La différence est très fine.

    Yield permet de vider la pile de message et donc potentiellement de dessiner plus qu'un seul composant (et donc rafraichir ceux qui ont besoin d'être rafraichi).

    Update permet de rafraichir ton composant.

    Donc si c'est juste rafraichir ton text control, Update peut être ce qu'il te faut, si il faut rafraichir plusieurs composants, YieldIfNeeded serait meilleur.

    La doc sur Yield
    http://docs.wxwidgets.org/2.6/wx_wxapp.html#wxappyield

    Ah noter qu'il faut parfois appeler yield malgré un update/refresh sous Windows. (En tout cas c'était valable à une version inférieure ou égale à la 2.8.4 (celle que j'utilise), je ne sais pas si le bug a été corrigé)

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

Discussions similaires

  1. Thread - Afficher lignes au fur et à mesure
    Par piloupolo dans le forum Général Java
    Réponses: 1
    Dernier message: 17/02/2010, 13h34
  2. Réponses: 9
    Dernier message: 30/09/2009, 11h23
  3. Afficher la sortie STDOUT au fur et à mesure dans un widget Tk
    Par djibril dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 13/03/2009, 11h35
  4. Réponses: 3
    Dernier message: 30/07/2008, 15h52
  5. Réponses: 4
    Dernier message: 13/01/2007, 23h57

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