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 :

Je ne peux pas arrêter le wxTimer avec Stop()


Sujet :

wxWidgets

  1. #1
    Membre régulier Avatar de yostane
    Homme Profil pro
    test
    Inscrit en
    Mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : test

    Informations forums :
    Inscription : Mars 2006
    Messages : 84
    Points : 106
    Points
    106
    Par défaut Je ne peux pas arrêter le wxTimer avec Stop()
    Normalement quand je tape Espace le timer s'arrête, le wxMessageBox s'affiche mais le timervne s'arrête pas. Je n'y comprends rien.
    myPanel dérive de wxPanel. j'utilise wx2.8.0
    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
     
    void C8Panel::NewGame ()
    {
        running = true;
        myTimer.Start(50);
    }
     
    void myPanel::OnKeyDown(wxKeyEvent &event)
    {
        switch (event.GetKeyCode())
        {
        case WXK_SPACE:
            wxMessageBox("espace tapé");
            myTimer.Stop();
            break;
     
     
        default:
            event.Skip();
            break;
        }
    }
     
    void myPanel::OnTimer(wxTimerEvent& event)
    {
        for (int i=0; i<20; i++)
        {
             //Do something
        }
        Refresh();
    }

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    a mon avis, le problème vient du fait que le timer est crée et utilisé dans deux classes différentes et donc possiblement dans deux thread, or dans la doc, il y a ceci:

    Note: A timer can only be used from the main thread.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    J'ai testé le bout de code ci-dessous et il marche parfaitement pourvu que la fenêtre principale (classe MyFrame) ait le focus.

    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
     
    #include "wx/wxprec.h"
     
    #ifdef __BORLANDC__
        #pragma hdrstop
    #endif
     
    #ifndef WX_PRECOMP
        #include "wx/wx.h"
    #endif
     
    #define TIMER_ID    10100
    #define MNU_QUIT    10200
     
    class MyApp : public wxApp
    {
        public:
     
            virtual bool OnInit();
     
            wxTimer myTimer;
    };
     
    class MyFrame : public wxFrame
    {
        DECLARE_EVENT_TABLE()
     
        public:
            MyFrame(const wxString& title, const wxPoint& pos,
                         const wxSize& size,
                         long style = wxDEFAULT_FRAME_STYLE);
     
            void OnQuit(wxCommandEvent& event);
            void OnKeyDown(wxKeyEvent &event);
            void OnTimer(wxTimerEvent& event);
     
    };
     
    BEGIN_EVENT_TABLE(MyFrame, wxFrame)
        EVT_TIMER(TIMER_ID, MyFrame::OnTimer)
        EVT_MENU(MNU_QUIT,  MyFrame::OnQuit)
        EVT_KEY_DOWN(MyFrame::OnKeyDown)
    END_EVENT_TABLE()
     
    IMPLEMENT_APP(MyApp)
     
    bool MyApp::OnInit()
    {
        MyFrame *frame = new MyFrame(_T("Minimal wxWindows App"),
                                     wxPoint(50, 50), wxSize(450, 340));
        frame->Show(TRUE);
        new wxLogWindow(frame, _T("Debug"));
     
        wxGetApp().myTimer.SetOwner(frame, TIMER_ID);
        wxGetApp().myTimer.Start(50);
        return TRUE;
    }
     
    MyFrame::MyFrame(const wxString& title, const wxPoint& pos,
                               const wxSize& size, long style) :
                  wxFrame(NULL, -1, title, pos, size, style)
    {
        wxMenu *menuFile = new wxMenu;
        menuFile->Append(MNU_QUIT, _T("E&xit\tAlt-X"), _T("Quit this program"));
        wxMenuBar *menuBar = new wxMenuBar();
        menuBar->Append(menuFile, _T("&File"));
        SetMenuBar(menuBar);
     
        CreateStatusBar(2);
        SetStatusText(_T("Welcome to wxWindows!"));
    }
     
    void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)){Close(TRUE);}
     
    void MyFrame::OnKeyDown(wxKeyEvent &event)
    {
        switch (event.GetKeyCode())
        {
            case WXK_SPACE:
                wxLogMessage("espace tapé : Timer stoppé");
                wxGetApp().myTimer.Stop();
                break;
            default:
                event.Skip();
        }
    }
     
    void MyFrame::OnTimer(wxTimerEvent& event)
    {
        wxLogMessage("OnTimer");
    }
    Je pense que tu devrais déjà vérifier que le timer soit bien lancé en vérifiant le retour de la fonction Start. Ton panel semble avoir le focus puisque l'appuis sur la touche est pris en compte (affichage du message).
    L'histoire des "threads" implicites n'est pas envisageable, la remarque sur la documentation wxWidgets n'est valable que pour les "threads" explicites.
    Je ne veux pas te froisser, mais es tu bien sur que tu fais appel à la même instance d'objet wxTimer lorsque tu appelle "myTimer.Start(50);" et "myTimer.Stop();" étant donné que l'appel est fait dans deux instances différentes de deux classes différentes il est possible que tu es déclaré à deux endroits l'instance myTimer de la classe wxTimer.

    Cordialement

Discussions similaires

  1. [MySQL-5.6] Ne peux pas utiliser une base avec un utilisateur crée
    Par cryo94 dans le forum Administration
    Réponses: 1
    Dernier message: 27/04/2013, 16h40
  2. Excel ne peux pas compléter la tache avec les ressources disponible
    Par hbc87 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/07/2010, 15h05
  3. Ne sais (peux ?) pas choisir un OS avec LILO.
    Par botakelymg dans le forum Administration système
    Réponses: 2
    Dernier message: 10/05/2007, 21h50
  4. Problème avec recordset, il peux pas lire les type binaire
    Par deeps123 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/04/2007, 16h22
  5. [Firebird] on ne peux pas l'exploiter avec Delphi 2005 ??
    Par Harry dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/04/2005, 11h40

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