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 :

[TThread][TTimer] comment utiliser un timer dans un thread ?


Sujet :

C++Builder

  1. #1
    Expert confirmé
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Points : 4 972
    Points
    4 972
    Par défaut [TThread][TTimer] comment utiliser un timer dans un thread ?
    Bonjour

    J'ai un thread qui a dans son .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //...
    TTimer *Timer1;
    void __fastcall EventTimer1(TObject *Sender);
    //...
    dans 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
    //...
    void __fastcall MyThread::Execute()
    {
    Timer1 = new TTimer(NULL);
    Timer1->Enabled=false;
    Timer1->OnTimer=EventTimer1;
    Timer1->Interval=100;
    //...
    Timer1->Enabled=true;
    }
     
    void __fastcall MyThread::EventTimer1(TObject *Sender)
    {
     stringlist1->Add(asValue);
    }
    et mon timer ne s'éxécute jamais. malgré que le thread existe pendant pret de 7 secondes.

    Afin de tester mon code j'avais ajouté :
    a la fin de la methode Execute, et j'avais bien 1 valeur dans mon StringList a la fin.

    donc comment faire pour que mon Timer fasse son job ?

    Merci a vous par avance

  2. #2
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Je ne sais pas trop se que tu veut faire mais a priori on ne mais jamais de composant VCL dans un Thread, les composant son mis sur une fiche (même si ce ne sont pas des composants graphiques) ou a la limite dans une simple classe mais pas dans un Thread, par contre, grace à la fonction Synchronize du Thread, tu peut accéder au evenement du Timer que tu aura placé sur ta fiche.

    J'espère avoir été clair et ne pas trop mettre emélé

  3. #3
    Expert confirmé
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Points : 4 972
    Points
    4 972
    Par défaut
    Bon, suite a ta remarque j'ai repensé mon thread

    a la fin de Execute j'ai ajouté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fin=true;
    while(fin)
    {
    //code de mon Event
    Application->ProcessMessage();
    }
    et j'ai ajouté une methode public FinishThread
    il me reste quelques test a faire, mais ca fonctionne a priori

    netah

    merci pottiez

  4. #4
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    De rien, si tu as d'autre problemes tu sais ou venir

  5. #5
    Expert confirmé
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Points : 4 972
    Points
    4 972
    Par défaut
    je m'en sors pas je vais donc poser une question générale sur les thread

    je vais pas rentrer dans les details, mais en gros j'ai une grosse class qui gere mon système.

    et dans une des méthodes j'ai besoin de faire une acquisition regulière de data.

    comment je dois faire ?

    disons que ma tache d'acquisition est la methode AcquData()

    il se trouve que cette méthode ralentit enormement mon execution.

    je fais un threads qui appel AcquData avec Synchronize ? je déplace AcquData dans mon thread ? autre ?


  6. #6
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Les deux solution sont possible, tout dépend ou tu as besoin de ces infos, a prioris dans ta fiche, donc je la laisserai dans la fiche et je l'appelerai avec un Synchronize.

  7. #7
    Expert confirmé
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Points : 4 972
    Points
    4 972
    Par défaut
    Citation Envoyé par pottiez
    Les deux solution sont possible, tout dépend ou tu as besoin de ces infos, a prioris dans ta fiche, donc je la laisserai dans la fiche et je l'appelerai avec un Synchronize.
    si je fais comme ca , je viens de tester, ca me ralentit toujours beaucoup mon applis, execution 3 x plus lente ...

    quekls info je peux donner pour que vous m'aidier a faire le bon choix ?

  8. #8
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    La configuration de ton programme, combient de fiche, combien de thread, combien de classe, quel classe connait quel classe, etc...

  9. #9
    Expert confirmé
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Points : 4 972
    Points
    4 972
    Par défaut
    alors j'ai :

    une Unit d'authentification
    | --> une unit de configuration
    | | --> ma unit principale de fonctionnement

    c'est unit principal gère toute la partie interface et tous le pilotage du système (un robot) est géré par une class (PilotageLib)

    PilotageLib dispose de 2 classes , un class lui permettant de gérer le port USB, une autre le port Série

    lors de sa construction elle construit 1 usb et 4 port serie

    et donc maintenant un thread.

    le code qui me ralentit utilise les communications séries pour remplir de TStringList

    netah

  10. #10
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Dans ce cas, tu peut facilement mettre ta fonction dans le Thread, et remplir le TStringList avec un Synchronize(), en fonction de la ou est placé le TStringList.

  11. #11
    Expert confirmé
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Points : 4 972
    Points
    4 972
    Par défaut
    Citation Envoyé par pottiez
    Dans ce cas, tu peut facilement mettre ta fonction dans le Thread, et remplir le TStringList avec un Synchronize(), en fonction de la ou est placé le TStringList.
    ca ressmble a quoi un code comme ca ?

    car le Synchronize j'ai pas encore trop compris ce que je devais lui passer en parametre ...

    netah

  12. #12
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    En fait tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Synchronize(instruction normale de C++) ;
    En fait cette fonction sert à ce que on n'appelle pas la meme fonction en meme temps, comme c'est dans un thread, on ne sais pas quand est appelé la fonction, donc on synchronise pour eviter des conflits.

  13. #13
    Expert confirmé
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Points : 4 972
    Points
    4 972
    Par défaut
    dernière chose, dans mon thread a l'intérieur de Synchroniyze, si je veux utiliser des propriété de ma class appelant le thread, je peux le faire directement ? ou je dois les déclarer en extern ?

    merci

  14. #14
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Deux condition pour pouvoir appeller une propriété, il faut que le thread connaisse la classe, a priorie c'est bon vu que tu accede au TStringList, il faut que le thread est les droit sur la propriété, pour qu'il est les droits, soit mettre la propriété en public, soit mettre deux fonction (une lire et une ecrire) en public, qui agit sur la propriété qui elle est en private ou protected

  15. #15
    Expert confirmé
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Points : 4 972
    Points
    4 972
    Par défaut
    Bon j'ai essayé de faire un exemple clair de mon probleme ...

    en gros, j'ai une appli appelante :
    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
    //$$---- Form CPP ----
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    #include "unit2.h"
     
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
     
    TExemple *Exemple;
     
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    	Label1->Caption=1;
    	Exemple = new TExemple();
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	Exemple->Start();	
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    	Exemple->Stop();	
    }
    //---------------------------------------------------------------------------
    qui utilise donc une class :

    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
     
    #pragma hdrstop
     
    #include "Unit2.h"
    #include "Unit3.h"
     
    //---------------------------------------------------------------------------
     
    #pragma package(smart_init)
     
    TMyThread *thread;
     
    TExemple::TExemple()
    {
    	Timer1 = new TTimer(NULL);
    	Timer1->Enabled  = false;
    	Timer1->OnTimer  = EventTimer1;
    	Timer1->Interval = 50;
    }
     
    TExemple::~TExemple()
    {
    	delete Timer1;
    }
     
    void __fastcall TExemple::EventTimer1(TObject *Sender)
    {
    	Form1->Label1->Caption=(StrToInt(Form1->Label1->Caption)+1);
    }
     
    void TExemple::Start()
    {
    	Timer1->Enabled=true;
    	thread = new TMyThread(false);
    }
     
    void TExemple::Stop()
    {
    	Timer1->Enabled=false;
    	thread->StopThread();
    	delete thread;
    }
     
    void TExemple::AcquData()
    {
    	Sleep(500);
    }
    qui elle meme utilise un thread :

    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
    //$$---- Thread CPP ----
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit3.h"
    #include "Unit2.h"
    #pragma package(smart_init)
     
    extern TExemple *Exemple;
     
    bool fin;
     
    __fastcall TMyThread::TMyThread(bool CreateSuspended)
    	: TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TMyThread::Execute()
    {
    	fin=true;
     
    	while(fin)
    	{
    		Synchronize(&Acqu);
    		Application->ProcessMessages();
        }
    }
    //---------------------------------------------------------------------------
     
    void TMyThread::StopThread()
    {
    	fin = false;
    }
     
    void __fastcall TMyThread::Acqu()
    {
    	Exemple->AcquData();
    }

    Mon but (et peut etre que je sur estime le pouvoir des threads) etait de pouvoir faire tourner AcquData (de la class) sans ralentir l'execution du timer, dont dépendent des element de sécurité de mon système.

    Seulement mes incrément (dans cette exemple) se font a la vitesse de mon Sleep (represantant ma fonction blocante car lente)

    Un thread peut il bien repondre a ma problematique ?

    Comment gérer la priorité du thread si cela peut avoir une influence positive,

    est ce que j'ai rien compris ?


  16. #16
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Pour la priorité du Thread, il vaut mieux la laisser en normale, car si on le regle mal, tu peut etre amené a bloqué le PC complet et à devoir rebooter.

    Pour ta fonction AcquData() qui contien le Sleep(), mais son contenu dans la fonction Acqu() de ton Thread, plutot que de simplement l'appeler, ensuite, il me semble que dans cette fonction tu devait remplir un TStringList(dis moi si je me trompe), il faudrais que je sache dans quel classe il est instentié et avec quel securité (public, private,protected).

  17. #17
    Expert confirmé
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Points : 4 972
    Points
    4 972
    Par défaut
    bon en fait je ne peux pas déplacer le code de AcquData, car il contient des appel a des hinstance d'une class de communication par le port série.

    c'est le return de ces methode qui est misdanns des TStringList.

    en gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PuissanceFC -> Add ( u1500FC->ReadMotor(28) );
    PuissanceRA -> Add ( u1500RA->ReadMotor(28) );
    PuissanceFB -> Add ( u1500FB->ReadMotor(28) );
    PuissanceAB -> Add ( u1500AB->ReadMotor(28) );
    u1500xx sont des hinstances d'une class de communication avec le port série que j'ai écrit

    PuissanceXX sont des TStringList

  18. #18
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    C'est embétant, car c'est en partie (a mon avis) a cause des acces serie que ca devient long, et ce serai donc le principale a mettre dans le thread.

    il faudrait que ton Thread connaisse les classe port serie, par exemple, lorsque tu le créé tu lui donne l'adresse des 4 classe port serie.

  19. #19
    Expert confirmé
    Avatar de netah25
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    3 233
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 233
    Points : 4 972
    Points
    4 972
    Par défaut
    Citation Envoyé par pottiez
    C'est embétant, car c'est en partie (a mon avis) a cause des acces serie que ca devient long, et ce serai donc le principale a mettre dans le thread.

    il faudrait que ton Thread connaisse les classe port serie, par exemple, lorsque tu le créé tu lui donne l'adresse des 4 classe port serie.
    je vais essayer ca, mais j'ai essayé de mettre le Sleep(500) dans le Acqu() de MyThread et j'ai les meme raentissement ...

    je te dis si mes tests seront concluant

    merci pourle temps que tume consacre

  20. #20
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonjour,
    l'utilisation de <Application->ProcessMessages()> dans la méthode Execute est a proscrire, en effet cela provoque des conflits avec le Thread VCL Principal a savoir celui de ta Form de base --> ralentissements

    dans le corps de la méthode Execute de ton thread il est conseillé d'utilisé la boucle suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(!Terminated)
    {
      //ton code
    }
    ceci garanti de pouvoir utiliser les appels à Terminate() de ton thread


    personellement je n'utilise jamais Un TTimer dans un Thread, J'ai cré une classe TTimer Thread qui utilise les appels au API Win32 a savoir SetEvent,WaitForSingleObject

    un petit exemple de code
    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
     
    le .H
     
    //---------------------------------------------------------------------------
    #ifndef MytimerH
    #define MytimerH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    //---------------------------------------------------------------------------
    class TMyTimerThread : public TThread
    {
    private:
          HANDLE MyHandle;
          HANDLE MyEvent;
          bool FEnabled;
          unsigned long FInterval;
          TNotifyEvent FOnTimer;
          TThreadPriority FThreadPriority;
          void __fastcall SetEnabled(const bool Value);
          void __fastcall SetInterval(const unsigned long Value);
          void __fastcall SetOnTimer(const TNotifyEvent Value);
          void __fastcall Timer();
          void __fastcall SetThreadPriority(const TThreadPriority Value);
    protected:
        void __fastcall Execute();
    public:
        __fastcall TMyTimerThread(bool CreateSuspended);
        virtual __fastcall  ~TMyTimerThread();
        __property bool Enabled = {read=FEnabled, write=SetEnabled, default=true};
        __property unsigned long Interval = {read=FInterval, write=SetInterval, default=1000};
        __property TNotifyEvent OnTimer = {read=FOnTimer, write=SetOnTimer, default=NULL};
        __property TThreadPriority ThreadPriority = {read=FThreadPriority, write=SetThreadPriority, default=3};
    };
    //---------------------------------------------------------------------------
    #endif
    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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    le .cpp
    //---------------------------------------------------------------------------
    //#include "libpch.h"
    //#include <checks.h>
    #pragma hdrstop
     
    #include "Mytimer.h"
    #pragma package(smart_init)
    /*
    *************************************************
    FileName        :    MyTimer
     
    FileUsage       :    Classe de Timer pour le Project TimeDispatcher
     
    FileVersion     :    1
     
    FileDate        :    31.07.1998
     
    *************************************************/
     
     
     
     
     
    //---------------------------------------------------------------------------
    //   Important : les méthodes et les propriétés des objets dans la VCL ne peuvent
    //   être utilisées que dans une méthode appelée en utilisant Synchronize, par exemple :
    //
    //      Synchronize(UpdateCaption);
    //
    //   où UpdateCaption pourrait être du type :
    //
    //      void __fastcall TMyTimerThread::UpdateCaption()
    //      {
    //        Form1->Caption = "Mise à jour dans un thread";
    //      }
    //---------------------------------------------------------------------------
    __fastcall TMyTimerThread::TMyTimerThread(bool CreateSuspended)
        : TThread(CreateSuspended)
    {
        // TRACE("Methode Name " << "TMyTimerThread::TMyTimerThread " << "Id "  << this->ThreadID << " Entry at  " <<__TIME__);
       MyHandle=CreateEvent(NULL,false,false,NULL);
       MyEvent= CreateEvent(NULL,false,false,NULL);
       FOnTimer=NULL;
       FInterval=5000;
       FEnabled=false;
       Priority=tpNormal;
     
        // TRACE("Methode Name " << "TMyTimerThread::TMyTimerThread " << "Id "  << this->ThreadID << " Exit at  " <<__TIME__);
       Resume();
    }
    //---------------------------------------------------------------------------
    void __fastcall TMyTimerThread::Execute()
    {
         // TRACE("Methode Name " << "TMyTimerThread::Execute() " << "Id "  << this->ThreadID << " Entry at  " <<__TIME__);
        Priority = FThreadPriority;
       while(!Terminated)
        {
           if  (FEnabled)
           {
           	 WaitForSingleObject(MyHandle,FInterval);
             if (!Terminated)  Synchronize(Timer);
             }
            else
            {
             ResetEvent(MyEvent);
             WaitForSingleObject(MyEvent,INFINITE);
            }
     
        }
     
     
        //---- Placez le code du thread ici ----
        // TRACE("Methode Name " << "TMyTimerThread::Execute() " << "Id "  << this->ThreadID << " Exit at  " <<__TIME__);
    }
    //---------------------------------------------------------------------------
    void __fastcall  TMyTimerThread::SetEnabled(const bool Value)
    {
          if(!FEnabled)ResetEvent(MyEvent);
           FEnabled= Value;
          if (Value)SetEvent(MyEvent);
     
     
    }
    //---------------------------------------------------------------------------
    void __fastcall  TMyTimerThread::SetInterval(const unsigned long Value)
    {
       if (FEnabled)
         {
          FEnabled=false;
          FInterval = Value;
          FEnabled=true;
          }
        else
           FInterval = Value;
     
     
    }
    //---------------------------------------------------------------------------
    void __fastcall  TMyTimerThread::SetOnTimer(const TNotifyEvent Value)
    {
     
        if (FEnabled)
         {
          FEnabled=false;
          FOnTimer = Value;
          FEnabled=true;
         }
         else   FOnTimer = Value;
    }
    //---------------------------------------------------------------------------
    void __fastcall  TMyTimerThread::Timer()
    {
      if (FEnabled)
         {
           if (FOnTimer)FOnTimer(this);
         }
    }
    //---------------------------------------------------------------------------
    void __fastcall  TMyTimerThread::SetThreadPriority(const TThreadPriority Value)
    {
      FThreadPriority=Value;
    }
    //---------------------------------------------------------------------------
     
    __fastcall  TMyTimerThread::~TMyTimerThread()
    {
       // TRACE("Methode Name " << "TMyTimerThread::~TMyTimerThread() " << "Id "  << this->ThreadID << " Entry at  " <<__TIME__);
     
       SetEnabled(true);
       SetEvent(MyHandle);
       Terminate();
       WaitFor();
       CloseHandle(MyHandle);
     
       CloseHandle(MyEvent);
       // TRACE("Methode Name " << "TMyTimerThread::~TMyTimerThread() " << "Id "  << this->ThreadID << " Exit at  " <<__TIME__);
    }
    cette classe s'utilise comme un Timer Normal mais à l'aventage de ne pas avoir besoin de Handle de Fenêtre

    Pour solutionner ton application j'utiliserais plusieurs Threads

    un WorkerThread qui a pour tache de créer,surveiller et synchroniser l'ensemble des threads que tu crées.
    un ou plusieurs TimerThreads
    un thread d'acquisition

    cordialement

Discussions similaires

  1. comment utiliser les lock dans les threads ?
    Par skad dans le forum Général Python
    Réponses: 2
    Dernier message: 15/07/2008, 14h28
  2. comment utiliser un Timer dans ma methode rpc
    Par groupe dans le forum GWT et Vaadin
    Réponses: 7
    Dernier message: 01/07/2008, 15h01
  3. comment acceder à un timer dans un thread?
    Par Jayceblaster dans le forum Windows Forms
    Réponses: 1
    Dernier message: 26/07/2007, 09h04
  4. Réponses: 4
    Dernier message: 16/02/2006, 16h28
  5. Utiliser un timer dans une application console
    Par chavers dans le forum Langage
    Réponses: 8
    Dernier message: 25/05/2005, 14h07

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