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

C++Builder Discussion :

Détruire un TTimer dans son évenement OnTimer, risqué ?


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité(e)
    Invité(e)
    Par défaut Détruire un TTimer dans son évenement OnTimer, risqué ?
    Bonjour,

    J'ai besoin de créer un Timer autonome : sa destruction doit être automatique, j'ai donc testé le code suivant :

    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
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        Timer1 = new TTimer(NULL);
        Timer1->OnTimer = Timer1Timer;
     
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
        static int i = 0;
     
        // juste pour que quelchose bouge
        Caption = IntToStr(i);
     
        // après dix secondes, on détruit le timer
        if(10 == ++i) {
            // C'est la ligne suivante qui me fait peur : a t on le droit
            // de détruire le timer dans son propre gestionnaire d'evt ?
            delete Timer1;
            Timer1 = NULL;
        }
    }
    //---------------------------------------------------------------------------
    Apparemment, ça fonctionne, mais j'ai un peu peur que ça puisse me sauter à la figure dans un projet plus vaste. (Certains principes de c++builder m'échappent encore)
    Qu'en pensez vous ?

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut mabu
    J'avais teste ceci, je ne sais pas si cela va t'aider
    le .h
    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
     
    //---------------------------------------------------------------------------
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components
            TButton *Button1;
            TButton *Button2;
            TTimer *Timer1;
            TLabel *Label1;
            void __fastcall Button1Click(TObject *Sender);
            void __fastcall Button2Click(TObject *Sender);
    private: // User declarations
    public:  // User declarations
            __fastcall TForm1(TComponent* Owner);
            TTimer *temp;
            void __fastcall TForm1::tempTimer(TObject *Sender);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    le .cpp
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include "ExtCtrls.hpp"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    int nb;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    temp = new TTimer(this);
    temp->Enabled = true;
    temp->Interval = 1000;
    temp->OnTimer = tempTimer;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    if(temp)
    {
    temp->Enabled = false;
    delete temp;
    temp = NULL;
    nb = 0;
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::tempTimer(TObject *Sender)
    {
    Label1->Caption = nb;
    nb = nb + 1;
    }
    //---------------------------------------------------------------------------

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par blondelle Voir le message
    Salut mabu
    J'avais teste ceci, je ne sais pas si cela va t'aider
    [...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
        if(temp)
        {
            temp->Enabled = false;
            delete temp;
            temp = NULL;
            nb = 0;
        }
    }
    Merci, mais en fait, comme on le voit dans ton exemple, l'utilisateur doit cliquer sur un bouton pour détruire le TTimer, Dans un environnement monothread, cela ne pose pas de problème.

    Dans mon cas, je ne veux même pas que l'utilisateur ai conscience du TTimer.

    En fait, j'aurai pu poser ma question autrement : quel est le mécanisme d'appel de l'événement OnTimer d'un TTimer ?

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Le code d'arret qu'il soit dans les evenements d'un Button ou dans ton code, ne devrais pas poser de probleme en prenant soins de verifier que le timer est en fonction, puis l'arreter et le detruire

  5. #5
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Citation Envoyé par mabu Voir le message
    En fait, j'aurai pu poser ma question autrement : quel est le mécanisme d'appel de l'événement OnTimer d'un TTimer ?
    D'après le code situé dans ExtCtrls.pas, le constructeur de TTimer alloue une fenêtre invisible (de classe TPUtilWindow, visible avec Spy++) associée à un Timer Windows. La windowproc de la fenêtre créée se contente de réagir au message WM_TIMER et appelle ton événement en conséquence...

    Donc coup de bol, vu la simplicité de ce composant, la destruction pendant l'exécution de l'événement ne pose pas de problème, mais voilà, c'est du bol... Juste après l'exécution de ton événement, s'il bricolait en choses en interne, ça se crasherait...

    Pourquoi ne pas simplement désactiver le timer ? Tu en crées un au démarrage, et tu l'actives/désactives au besoin...

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par totoche76 Voir le message
    Donc coup de bol, vu la simplicité de ce composant, la destruction pendant l'exécution de l'événement ne pose pas de problème, mais voilà, c'est du bol... Juste après l'exécution de ton événement, s'il bricolait en choses en interne, ça se crasherait...
    Okay, bien vu.
    Donc aujourd'hui, ça ne crashe pas et c'est normal (même si c'est un coup de pot), mais rien ne garantit que dans le futur la gestion des TTimer puisse changer.
    Je dois donc me méfier si je veux une solution pérenne.

    Citation Envoyé par totoche76 Voir le message
    Pourquoi ne pas simplement désactiver le timer ? Tu en crées un au démarrage, et tu l'actives/désactives au besoin...
    L'idée est bonne, mais j'avais en tête de supprimer au plus vite les ressources inutiles, car même si on a de la marge, je n'aime pas avoir des objets initialisés alors que je sais pertinemment qu'il ne me serviront plus.

    Je pense donc que je vais m'orienter vers une gestion WM_TIMER à l'ancienne.

    Merci bien

Discussions similaires

  1. Réponses: 6
    Dernier message: 10/06/2008, 16h55
  2. Détruire un bouton sur son OnClick
    Par Volfoni dans le forum C++Builder
    Réponses: 5
    Dernier message: 08/06/2006, 12h00
  3. Comment insérer la recherche google dans son site ?
    Par freud dans le forum Services
    Réponses: 4
    Dernier message: 02/07/2005, 08h51
  4. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 14h57
  5. Comment gérer plusieurs icones dans son exécutable ?
    Par declencher dans le forum Langage
    Réponses: 5
    Dernier message: 15/10/2003, 10h49

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