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

MFC Discussion :

qui a testé la librairie "temps reel" Hadcon ?


Sujet :

MFC

  1. #1
    Membre régulier

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2002
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 216
    Points : 120
    Points
    120
    Par défaut qui a testé la librairie "temps reel" Hadcon ?
    bonjour, j'aimerai savoir si quelqu'un à déja testé la librairie temps réel Hadcon :
    http://www.codeproject.com/KB/system...imeModule.aspx
    http://www.hadcon.ru/

    qui est a priori libre...
    merci

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Au risque de te décevoir, je ne l'ai pas testé ...
    Mais les commentaires que je lis sur codeproject rejoignent ce que je sais : NT/2000/XP ne sont en aucun cas des OS Temps réel et je pense que cette librairie n'est pas une bonne solution.
    Si tu veux absolument faire ton programme sous Windows, la solution la plus simple est d'utiliser la librairie winmm.lib qui offre les timers multimedias.
    Fait une recherche sur le Web, ils sont simples d'utilisation et offrent une très bonne précision ... au bémol près qu'on ne maîtrise pas le jitter (glissement) temporel => on peut sans trop de problème cadencer des threads à 10 voir 1ms (mais il faut accepter que de temps en temps, il y est des "absences" - ex un swap de l'OS, un démarrage d'application).
    Ci Joint un petit exemple d'encapsulation pour utiliser des threads voir des threads appelant une fonction périodiquement (avec des timers multimédias).
    Ces classes sont des virtuelles pures et il suffit juste de dériver des classes concrètes implémentant le corps du thread ou la fonction qui doit être appelée périodiquement.
    Le header :
    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
    class CThread
    {
     
    public:
        // corps du thread
        virtual UINT BodyThread(void) = 0;        
     
        CThread();
        virtual ~CThread();
        // demarrage du thread
        void BeginThread(int nPriority = THREAD_PRIORITY_HIGHEST);
        // envoi de l'evenement d'arret
        void SendStop(void);
        // attente de la fin du thread
        void WaitTerminate(DWORD timeoutMs = INFINITE);
        // demande de l'arret du thread avec attente de sa fin
        void StopThread(DWORD timeoutMs = INFINITE) { SendStop(); WaitTerminate(timeoutMs);};
     
    protected:
        HANDLE m_hEventStop;        // Evenement signale pour l'arret du thread
        HANDLE m_hThread;           // handle du thread
    };
     
     
    // definition d'un thread periodique
    class CThreadPer : public CThread
    {
     
    public:
        // fonction qui sera appelee periodiquement
        // si elle renvoie une valeur differente de 0
        // on arrete le thread
        virtual UINT PeriodicFct(void) = 0;
     
        // corps du thread
        virtual UINT BodyThread(void);
     
        // fct utilisee par l'objet manager 
        void BeginThreadPer(DWORD perMs, int nPriority = THREAD_PRIORITY_HIGHEST)
        {
            // on stocke la periode d'appel
            m_perMs = perMs;
            // et on lance le thread
            BeginThread(nPriority);
        };
    private:
        DWORD  m_perMs;                 // periode en ms
    };
    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
    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
    /////////////////////////////////////////////////////////////////////////////
    // Procedure de demarrage du thread (param de AfxBeginThread)
    /////////////////////////////////////////////////////////////////////////////
    static DWORD WINAPI ProcThread(LPVOID pParam) 
    {
        CThread * pThreadAcq = (CThread*) pParam;
        return pThreadAcq->BodyThread();
    }
     
    /////////////////////////////////////////////////////////////////////////////
    // Constructeur
    /////////////////////////////////////////////////////////////////////////////
    CThread::CThread()
    {
        m_hThread = NULL;
        m_hEventStop = ::CreateEvent(NULL, false, false, NULL);
    }
     
    /////////////////////////////////////////////////////////////////////////////
    // Destructeur
    /////////////////////////////////////////////////////////////////////////////
    CThread::~CThread()
    {
        if (m_hThread)
        {
            // on force l'arret du thread
            StopThread();
        }
     
        CloseHandle(m_hEventStop);
    }
     
    /////////////////////////////////////////////////////////////////////////////
    /// Demarrage du thread
    ///
    /// Parametres :
    /// \param nPriority    priorite du thread
    /////////////////////////////////////////////////////////////////////////////
    void CThread::BeginThread(int nPriority)
    {
        DWORD dwThreadId;
     
        // Demarrage du thread
        m_hThread = ::CreateThread( NULL
                                        , 0
                                        , ProcThread
                                        , this
                                        , CREATE_SUSPENDED
                                        , &dwThreadId
                                        );
        ::SetThreadPriority(m_hThread, nPriority);
     
        // Activation du thread
        ::ResumeThread(m_hThread);
    }
    /////////////////////////////////////////////////////////////////////////////
    /// Demande d'arret du thread
    /////////////////////////////////////////////////////////////////////////////
    void CThread::SendStop(void)
    {
        // Envoi de l'evenement d'arret
        SetEvent(m_hEventStop);
     
    }
    /////////////////////////////////////////////////////////////////////////////
    /// Attente de l'arret du thread
    ///
    /// Parametres :
    /// \param timeoutMs    timeout d'attente de l'arret du thread en ms
    /////////////////////////////////////////////////////////////////////////////
    void CThread::WaitTerminate(DWORD timeoutMs /*= INFINITE*/)
    {
        if (m_hThread == NULL)
        {
            return;
        }
     
        // Attente de l'arret effectif du thread
        WaitForSingleObject(m_hThread, timeoutMs);
     
        CloseHandle(m_hThread);
     
        m_hThread = NULL;
    }
     
     
    // Class CThreadPer
    /////////////////////////////////////////////////////////////////////////////
    // Corps du thread pour un thread periodique
    /////////////////////////////////////////////////////////////////////////////
    UINT CThreadPer::BodyThread(void)
    {
        HANDLE hEventPer = CreateEvent(NULL, false, false, "");
        HANDLE arrEvent[2];
        arrEvent[0] = m_hEventStop;
        arrEvent[1] = hEventPer;
     
        // creation du timer periodique
        UINT idMMTimer = timeSetEvent(m_perMs, 1, (LPTIMECALLBACK )hEventPer, 0 , TIME_PERIODIC | TIME_CALLBACK_EVENT_SET);
        while (1)
        {
            unsigned int taille = sizeof(arrEvent)/sizeof(HANDLE);
            DWORD dw = WaitForMultipleObjects(sizeof(arrEvent)/sizeof(HANDLE), arrEvent, false, INFINITE);
            if (dw == WAIT_OBJECT_0)
            {
                // demande d'arret => on sort
                timeKillEvent(idMMTimer);
                CloseHandle(hEventPer);
                return 0;
            }
            else if (dw == WAIT_OBJECT_0 + 1)
            {
                // appel de la fonction periodique
                if (PeriodicFct() != 0)
                {
                    // demande d'arret => on sort
                    timeKillEvent(idMMTimer);
                    CloseHandle(hEventPer);
                    return 0;
                }
            }
            else
            {
                dw = GetLastError();
            }
        }
        return 0;
    }

  3. #3
    Membre régulier

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2002
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 216
    Points : 120
    Points
    120
    Par défaut
    GRAND Merci,
    je vais essayer d'exploiter !
    ...
    Bon Week End...

Discussions similaires

  1. Stats : connaitre en temps reel les requetes en cours d'exec
    Par jeff37 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/12/2004, 17h01
  2. [Info][Debutant(e)]affichage temps reel
    Par nine dans le forum Développement Web en Java
    Réponses: 15
    Dernier message: 26/11/2004, 17h03
  3. Réponses: 5
    Dernier message: 19/07/2004, 17h27
  4. Linux et le temps réel
    Par Shrem dans le forum Administration système
    Réponses: 6
    Dernier message: 11/12/2002, 08h21

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