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 :

WxWidgets et wxTextCtrl


Sujet :

wxWidgets

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut WxWidgets et wxTextCtrl
    Bonjour,

    je suis en train d'écrire ma première application avec WxWidgets que je trouve vraiment sympa et plus simple à mon gout que d'autre lib du même genre...

    Je suis confronté à un problème qui m'empêche de dormir tranquillement, peut être que quelqu'un ici pourra m'aider...

    POur éviter de faire un copier/coller de toutes mes lignes de codes qui servirait pas à granc chose, j'ai reproduit le problème en plus court :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    #include <wx/wx.h>
     
     
    class 
    Exempleapp : public wxApp
    {
    	public:
    		virtual bool OnInit();
    };
     
    class 
    ExempleFrame : public wxFrame
    {
    	public:
    		ExempleFrame( const wxString& title, const wxPoint& pos, const wxSize& pos );
    		void OnQuit( wxCommandEvent& event );
    		void OnAbout( wxCommandEvent& event );
    		void OnStart( wxCommandEvent& event );
    		void OnTimer(wxTimerEvent&);
     
    	private:
    		wxTextCtrl *mlTextCtrl;
    		wxTimer *MonTimer;
     
    		DECLARE_EVENT_TABLE()
    };
     
    enum
    {
    	Menu_File_Quit = 100,
    	Menu_File_About,
    	Menu_File_Start,
    	Id_TextEdit,
    	Id_Timer
    };
     
     
     
    BEGIN_EVENT_TABLE( ExempleFrame, wxFrame )
    	EVT_MENU( Menu_File_Quit, ExempleFrame::OnQuit )
    	EVT_MENU( Menu_File_About, ExempleFrame::OnAbout )
    	EVT_MENU( Menu_File_Start, ExempleFrame::OnStart )
    	EVT_TIMER(Id_Timer, ExempleFrame::OnTimer)
    END_EVENT_TABLE()
     
    IMPLEMENT_APP(Exempleapp)
     
     
    bool 
    Exempleapp::OnInit()
    {
    	ExempleFrame *frame = new ExempleFrame( wxT( "Hello World" ), wxPoint(50,50), wxSize(450,340) );
     
    	frame->Show(TRUE);
    	SetTopWindow(frame);
    	return TRUE;
    } 
     
    ExempleFrame::ExempleFrame( const wxString& title, const wxPoint& pos, const wxSize& size )
    	: wxFrame((wxFrame *)NULL, -1, title, pos, size)
    {
    	wxMenu *menuFile = new wxMenu;
     
    	menuFile->Append( Menu_File_Start, wxT( "Start !" ) );
    	menuFile->AppendSeparator();
    	menuFile->Append( Menu_File_About, wxT( "&About..." ) );
    	menuFile->AppendSeparator();
    	menuFile->Append( Menu_File_Quit, wxT( "E&xit" ) );
     
    	wxMenuBar *menuBar = new wxMenuBar;
    	menuBar->Append( menuFile, wxT( "&File" ) );
     
    	SetMenuBar( menuBar );
     
    	CreateStatusBar();
    	SetStatusText( wxT( "Welcome to Kdevelop wxWidgets app!" ) );
     
    	mlTextCtrl = new wxTextCtrl(this, Id_TextEdit, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);// wxTE_MULTILINE | wxTE_CHARWRAP | wxTE_READONLY);
     
    	MonTimer = new wxTimer(this,Id_Timer);
    }
     
    void
    ExempleFrame::OnTimer(wxTimerEvent& event) {
    	mlTextCtrl->AppendText(wxT("Test"));
    }
     
    void 
    ExempleFrame::OnQuit( wxCommandEvent& WXUNUSED( event ) )
    {
    	Close(TRUE);
    }
     
    void 
    ExempleFrame::OnStart( wxCommandEvent& WXUNUSED( event ) ) 
    {
        	MonTimer->Start(100);
    }
     
     
    void 
    ExempleFrame::OnAbout( wxCommandEvent& WXUNUSED( event ) )
    {
    	wxMessageBox( wxT( "This is a wxWidgets Hello world sample" ),
    			wxT( "About Hello World" ), wxOK | wxICON_INFORMATION, this );
    }
    Voilà, ce code est tout bête, il affiche une fenetre avec un widget Text permettant d'afficher du texte, un timer claque toutes les 100ms et permet de rajouter du texte, faites tourner cette exemple pendant 2-3 minutes et vous allez constatez au bout d'un moment un fort ralentissement de l'appli, si vous esayez de la redimenssionnez, elle ne répond qu'après un certain temps, en gros, on dirait que lorsque le contrôle wxTextCtrl se rempli, il ne rend plus la main au reste...
    Vous pouvez aussi changer la valeur du timer et mettre par exemple 200ms, le problème apparaitra aussi mais plus tard...

    Si quelqu'un à une idée pour expliquer ce phénomène ou simplement pour le contrer, en fait, dans mon appli, j'ai juste besoin de venir d'ajouter en permanence, très souvent du texte à la suite dans le champ texte.

    Dernière précision, je suis actuellement sous Linux, j'ai essayé sous Windows XP Pro, ça me fait pareil.

    Merci d'avance à vous !

  2. #2
    Membre habitué Avatar de Marco85
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 210
    Points : 187
    Points
    187
    Par défaut
    Salut radikalfree !!!

    Moi j'ai testé le soft que tu as mis en exemple sur mon PC sous Windows XP Pro avec et sans l'hyper-threading (je croyais que ça venait de ça) pendant 10 minutes (les deux fois) et ça fonctionne très bien. Aucun ralentissement et je peux jouer à redimensionner la fenêtre sans problème.

    Quelle version de wxWidgets utilises-tu ?
    Ce problème apparaît-il avec ce programme d'exemple sur ton PC ?

    Marco85
    If you cannot explain a concept to a six year-old, then you do not fully understand it. [Albert Einstein]

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Marco85
    Salut radikalfree !!!

    Moi j'ai testé le soft que tu as mis en exemple sur mon PC sous Windows XP Pro avec et sans l'hyper-threading (je croyais que ça venait de ça) pendant 10 minutes (les deux fois) et ça fonctionne très bien. Aucun ralentissement et je peux jouer à redimensionner la fenêtre sans problème.

    Quelle version de wxWidgets utilises-tu ?
    Ce problème apparaît-il avec ce programme d'exemple sur ton PC ?

    Marco85
    Merci pour ta réponse...
    Le problème apparait bien avec ce programme d'exemple sous linux (64bits), je ne l'ai pas essayé sous windows.
    J'utilise la version 2.6 de wxWidgets.


    par contre, je ne l'ai pas expliqué plus haut mais peut etre l'as tu fait par toi même, il faut lancer le timer dans File > Start


    Ensuite, chez moi, au bout de 45sec - 1 minutes, mon CPU est à 100% d'utilisation (AMD64 2.2G) et la fenetre est très longue pour répondre...

  4. #4
    Membre habitué Avatar de Marco85
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 210
    Points : 187
    Points
    187
    Par défaut
    Citation Envoyé par radikalfree
    par contre, je ne l'ai pas expliqué plus haut mais peut etre l'as tu fait par toi même, il faut lancer le timer dans File > Start
    Re radikalfree,

    Moi je n'ai pas du tout ce genre de souci (j'ai bien lancé le timer et vu s'afficher les "Test" successivement) pendant 10 minutes. Par contre si ton CPU est à 100% d'utilisation, ça veut dire que ton soft bouffe les ressources matérielles ... Est-ce que tu joues avec la priorité du Thread ou du Process ?

    Marco85
    If you cannot explain a concept to a six year-old, then you do not fully understand it. [Albert Einstein]

  5. #5
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    sous win 2000, aucun pb non plus...

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Marco85
    Citation Envoyé par radikalfree
    par contre, je ne l'ai pas expliqué plus haut mais peut etre l'as tu fait par toi même, il faut lancer le timer dans File > Start
    Re radikalfree,

    Moi je n'ai pas du tout ce genre de souci (j'ai bien lancé le timer et vu s'afficher les "Test" successivement) pendant 10 minutes. Par contre si ton CPU est à 100% d'utilisation, ça veut dire que ton soft bouffe les ressources matérielles ... Est-ce que tu joues avec la priorité du Thread ou du Process ?

    Marco85
    Je ne touches pas du tout à la priorité ou quoi que ce soit...
    Je suis bien embêté, je vois pas du tout par ou aller là !!

    Merci pour tes tests !

  7. #7
    Membre habitué Avatar de Marco85
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 210
    Points : 187
    Points
    187
    Par défaut
    Citation Envoyé par radikalfree
    Je ne touches pas du tout à la priorité ou quoi que ce soit...
    Je suis bien embêté, je vois pas du tout par ou aller là !!
    Ok .. je m'en doutais bien un peu ... et j'avoue que là je coince un peu aussi ... En fait, c'est typiquement un problème de plateforme : là-dessus, on est d'accord, non ? Sinon, est-ce que tu peux loguer la valeur du timer à chaque passage dans la methode OnTimer et vérifier sa valeur quand le système ralenti s'il te plait ?

    Citation Envoyé par radikalfree
    Merci pour tes tests !
    Je t'en prie ... c'est avec plaisir !

    Marco85
    If you cannot explain a concept to a six year-old, then you do not fully understand it. [Albert Einstein]

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Marco85
    Citation Envoyé par radikalfree
    Je ne touches pas du tout à la priorité ou quoi que ce soit...
    Je suis bien embêté, je vois pas du tout par ou aller là !!
    Ok .. je m'en doutais bien un peu ... et j'avoue que là je coince un peu aussi ... En fait, c'est typiquement un problème de plateforme : là-dessus, on est d'accord, non ? Sinon, est-ce que tu peux loguer la valeur du timer à chaque passage dans la methode OnTimer et vérifier sa valeur quand le système ralenti s'il te plait ?

    Citation Envoyé par radikalfree
    Merci pour tes tests !
    Je t'en prie ... c'est avec plaisir !

    Marco85
    je viens de redémarrer et tester mon code sous windows XP Pro...il marche sans problème...
    On est donc bien d'accord, c'est un problème de plateforme. (le problème à lieu sur Ubuntu 5.10 donc gnome)

    Voilà le code que j'ai mis dans la méthode pour mesurer les temps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void
    ExempleFrame::OnTimer(wxTimerEvent& event) {
     
    	long toto;
     
    	toto = wxGetElapsedTime();
    	wxString ss;
    	ss.Append(ss.Format(wxT("valeur : %i"), toto));
     
    	SetStatusText( ss );
     
    	mlTextCtrl->AppendText(wxT("Test"));
    }
    Au début, tout se passe parfaitement bien, j'ai bien 100 (+-1%) puis ça commence à ramer et je passe des fois à 200ms...

    Je pense que ça vient de l'objet wxTextCtrl qui perd du temps à [scroller|faire l'append|autre...??]

    Quelqu'un pour tester sous gnome ?

    @++

  9. #9
    Membre habitué Avatar de Marco85
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 210
    Points : 187
    Points
    187
    Par défaut
    Citation Envoyé par radikalfree
    Je pense que ça vient de l'objet wxTextCtrl qui perd du temps à [scroller|faire l'append|autre...??]
    Re,

    Pour savoir si ça vient vraiment du wxTextCtrl, tu peux commenter le "AppendText" et toujours vérifier que la valeur du wxTimer ne change pas au bout de 2-3 minutes. Comme ça au moins, on sera sûr que ça ne vient pas du wxTimer ...

    Marco85
    If you cannot explain a concept to a six year-old, then you do not fully understand it. [Albert Einstein]

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Marco85
    Citation Envoyé par radikalfree
    Je pense que ça vient de l'objet wxTextCtrl qui perd du temps à [scroller|faire l'append|autre...??]
    Re,

    Pour savoir si ça vient vraiment du wxTextCtrl, tu peux commenter le "AppendText" et toujours vérifier que la valeur du wxTimer ne change pas au bout de 2-3 minutes. Comme ça au moins, on sera sûr que ça ne vient pas du wxTimer ...

    Marco85
    Bonjour,

    je viens de le laisser tourner un bon moment sans "append", ça fonctionne parfaitement donc, c'est bien le wxTextCtrl qui prend du temps au bout d'un moment !

    Que faire !!!!??? c'est horrible ce genre de problème !!
    Quelqu'un sous gnome pour tester ?

    Merci

  11. #11
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    regarde du coté de la doc de wx, plutot du coté des option, y'en a peut etre qui sont pas preconisées pour linux...

Discussions similaires

  1. wxWidgets : connaître l'etat d'un bouton !
    Par FSF_Sterl dans le forum wxWidgets
    Réponses: 5
    Dernier message: 14/08/2004, 08h55
  2. PB d'installation wxwidgets BCB6
    Par PsychicStorm dans le forum C++Builder
    Réponses: 3
    Dernier message: 18/05/2004, 16h02
  3. Réponses: 1
    Dernier message: 16/05/2004, 17h56
  4. wxWidgets - besoins d'aide...
    Par barbarello dans le forum wxWidgets
    Réponses: 2
    Dernier message: 07/05/2004, 09h33

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