Windows 7 fonctions de chronométrage - Comment utiliser GetSystemTimeAdjustment correctement?

J'ai couru quelques tests à l'aide de la GetSystemTimeAdjustment fonctionner sur Windows 7, et a obtenu quelques résultats intéressants qui je ne peux pas expliquer. Le saf que je comprends, cette méthode doit retourner si l'heure du système est synchronisé périodiquement et, si elle l'est, à quel intervalle et avec qui incrément, il est mis à jour (voir GetSystemTimeAdjustment fonction sur MSDN).

De ce je suis que si j'ai une requête, le système de temps par exemple à l'aide de GetSystemTimeAsFileTime repeatingly je devrais obtenir soit pas de changement (l'horloge système n'a pas été mis à jour), ou d'un changement qui est un multiple de l'intervalle récupérées par GetSystemTimeAdjustment. Question: cette hypothèse Est correcte?

Considérons maintenant la suite de tests de code:

#include <windows.h>
#include <iostream>
#include <iomanip>

int main()
{
    FILETIME fileStart;
    GetSystemTimeAsFileTime(&fileStart);
    ULARGE_INTEGER start;
    start.HighPart = fileStart.dwHighDateTime;
    start.LowPart = fileStart.dwLowDateTime;

    for (int i=20; i>0; --i)
    {
        FILETIME timeStamp1;
        ULARGE_INTEGER ts1;

        GetSystemTimeAsFileTime(&timeStamp1);

        ts1.HighPart = timeStamp1.dwHighDateTime;
        ts1.LowPart  = timeStamp1.dwLowDateTime;

        std::cout << "Timestamp: " << std::setprecision(20) << (double)(ts1.QuadPart - start.QuadPart) / 10000000 << std::endl;

    }

    DWORD dwTimeAdjustment = 0, dwTimeIncrement = 0, dwClockTick;
    BOOL fAdjustmentDisabled = TRUE;
    GetSystemTimeAdjustment(&dwTimeAdjustment, &dwTimeIncrement, &fAdjustmentDisabled);

    std::cout << "\nTime Adjustment disabled: " << fAdjustmentDisabled
        << "\nTime Adjustment: " << (double)dwTimeAdjustment/10000000
        << "\nTime Increment: " << (double)dwTimeIncrement/10000000 << std::endl;

}

Il faut 20 horodateurs dans une boucle et de les imprimer à la console. En fin de compte, il imprime l'incrémenter à laquelle l'horloge système est mis à jour. Je m'attends à voir les différences entre les horodateurs imprimé dans la boucle pour être 0 ou multiples de cette augmentation. Cependant, j'obtiens des résultats comme ceci:

Timestamp: 0
Timestamp: 0.0025000000000000001
Timestamp: 0.0074999999999999997
Timestamp: 0.01
Timestamp: 0.012500000000000001
Timestamp: 0.014999999999999999
Timestamp: 0.017500000000000002
Timestamp: 0.022499999999999999
Timestamp: 0.025000000000000001
Timestamp: 0.0275
Timestamp: 0.029999999999999999
Timestamp: 0.032500000000000001
Timestamp: 0.035000000000000003
Timestamp: 0.040000000000000001
Timestamp: 0.042500000000000003
Timestamp: 0.044999999999999998
Timestamp: 0.050000000000000003
Timestamp: 0.052499999999999998
Timestamp: 0.055
Timestamp: 0.057500000000000002

Time Adjustment disabled: 0
Time Adjustment: 0.0156001
Time Increment: 0.0156001

Il semble donc que l'heure du système est mis à jour avec un intervalle d'environ 0.0025 secondes et pas 0.0156 secondes que le retour par GetSystemTimeAdjustment.

Question deux: Quelle est la raison?

OriginalL'auteur fdlm | 2011-10-07