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 :

Calcul précis de temps sous RAD Studio 10.4


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Calcul précis de temps sous RAD Studio 10.4
    Bonjour à tous

    Je viens fraichement d'installer RAD Studio 10.4.1 et je rencontre quelques soucis de migration de projet.

    Faisant des logiciels qui calculent des temps de réaction, j'ai besoin de calculer le temps entre différents évènements qui surviennent.

    Avant j'effectuais mes calculs de temps comme ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    static __int64 FrequenceHorloge, Debut, Fin;
     
    QueryPerformanceCounter((LARGE_INTEGER*)&Debut);
    QueryPerformanceCounter((LARGE_INTEGER*)&Fin);
     
    QueryPerformanceFrequency((LARGE_INTEGER*)&FrequenceHorloge);
     
    double Temps = (Fin - Debut) / (double)FrequenceHorloge;


    J'ai une erreur sur le type LARGE_INTEGER qui n'existe pas.

    Avez-vous une solution à me proposer car l'utilisation d'un TTimer n'est pas assez précis.

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Bonjour,

    LARGE_INTEGER, ça correspond à __int64 ou à long long.

    As-tu essayé de tout simplement supprimer les cast (LARGE_INTEGER*)? Si une erreur se produit à la compilation elle indiquera le type attendu et donc le cast exact à effectuer.

  3. #3
    Membre chevronné
    bonsoir
    il vaut mieux utiliser les API Natives de MS
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BOOL QueryPerformanceCounter(
      LARGE_INTEGER *lpPerformanceCount
    );

    Attention un LARGE_INTEGER ne correspond pas un type simple mais il s'agit d'une Union
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef union _LARGE_INTEGER {
      struct {
        DWORD LowPart;
        LONG  HighPart;
      } DUMMYSTRUCTNAME;
      struct {
        DWORD LowPart;
        LONG  HighPart;
      } u;
      LONGLONG QuadPart;
    } LARGE_INTEGER

    cette déclaration se trouve dans le fichier winnt.h

    le code suivant devrait fonctionner

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    LARGE_INTEGER Debut;
    LARGE_INTEGER fin;
    if (QueryPerformanceCounter(&Debut)
    {
     
    // ton traitement
     
    }


    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  4. #4
    Membre confirmé
    Merci à vous pour vos réponses.

    Je viens de me rendre compte que cela ne pourra pas fonctionner pour cette application car je dois également la porter sur Android et que c'est une API Windows.

    Je cherche donc un code pouvant fonctionner sur toutes les plateformes.

    Je me demandais si on ne pouvais pas faire des opérations sur les TDateTime pour obtenir une différence de temps.

  5. #5
    Membre actif
    Salut,

    En C++, il y a std::chrono (steady_clock (ou high_resolution_clock, si ce n'est pas un alias))
    https://en.cppreference.com/w/cpp/ch...eady_clock/now
    https://en.cppreference.com/w/cpp/ch...tion_clock/now

  6. #6
    Membre chevronné
    La précision d'un TDateTime est de l'ordre le la milliseconde
    pour l'api MS c'est de l'ordre de la microseconde.
    concernant les API C++ pure cela dépend de la vitesse du processor voir ttps://stackoverflow.com/questions/48211688/how-accurate-is-stdchrono

    donc cela dépend essentiellement de la précision attendue

    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

###raw>template_hook.ano_emploi###