"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment puis-je obtenir une synchronisation précise à l’échelle de la nanoseconde sous Windows sans la prise en charge native de clock_gettime ?

Comment puis-je obtenir une synchronisation précise à l’échelle de la nanoseconde sous Windows sans la prise en charge native de clock_gettime ?

Publié le 2024-11-07
Parcourir:701

How can I achieve nanosecond precision timing on Windows without native clock_gettime support?

Portage de clock_gettime vers Windows

La fonction clock_gettime est une fonction standard POSIX qui permet d'obtenir l'heure actuelle avec une précision de la nanoseconde. Cependant, il n'est pas pris en charge nativement sous Windows.

Portage du code vers Windows

Pour porter le code qui utilise clock_gettime vers Windows, vous pouvez implémenter une fonction de remplacement à l'aide de Win32. API. Voici un exemple de la façon dont vous pouvez procéder :

#include <Windows.h>

// Returns the file time offset for Windows.
LARGE_INTEGER getFILETIMEoffset() {
    SYSTEMTIME s;
    FILETIME f;
    LARGE_INTEGER t;

    s.wYear = 1970;
    s.wMonth = 1;
    s.wDay = 1;
    s.wHour = 0;
    s.wMinute = 0;
    s.wSecond = 0;
    s.wMilliseconds = 0;
    SystemTimeToFileTime(&s, &f);
    t.QuadPart = f.dwHighDateTime;
    t.QuadPart <<= 32;
    t.QuadPart |= f.dwLowDateTime;
    return (t);
}

// Replacement for clock_gettime function.
int clock_gettime(int X, struct timeval *tv) {
    LARGE_INTEGER t;
    FILETIME f;
    double microseconds;
    static LARGE_INTEGER offset;
    static double frequencyToMicroseconds;
    static int initialized = 0;
    static BOOL usePerformanceCounter = 0;

    if (!initialized) {
        LARGE_INTEGER performanceFrequency;
        initialized = 1;
        usePerformanceCounter = QueryPerformanceFrequency(&performanceFrequency);
        if (usePerformanceCounter) {
            QueryPerformanceCounter(&offset);
            frequencyToMicroseconds = (double)performanceFrequency.QuadPart / 1000000.;
        } else {
            offset = getFILETIMEoffset();
            frequencyToMicroseconds = 10.;
        }
    }
    if (usePerformanceCounter) QueryPerformanceCounter(&t);
    else {
        GetSystemTimeAsFileTime(&f);
        t.QuadPart = f.dwHighDateTime;
        t.QuadPart <<= 32;
        t.QuadPart |= f.dwLowDateTime;
    }

    t.QuadPart -= offset.QuadPart;
    microseconds = (double)t.QuadPart / frequencyToMicroseconds;
    t.QuadPart = microseconds;
    tv->tv_sec = t.QuadPart / 1000000;
    tv->tv_usec = t.QuadPart % 1000000;
    return (0);
}

Une fois que vous avez implémenté la fonction de remplacement, vous pouvez l'utiliser dans votre code pour obtenir l'heure actuelle avec une précision de la nanoseconde. Notez que vous devrez peut-être apporter des modifications supplémentaires à votre code pour tenir compte des différences de comportement de clock_gettime sur différentes plates-formes.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3