Функции синхронизации Windows 7 - Как правильно использовать GetSystemTimeAdjustment?
Я провел несколько тестов, используяGetSystemTimeAdjustment
работать на Windows 7, и получил некоторые интересные результаты, которые я не могу объяснить. Насколько я понимаю, этот метод должен возвращаться, если системное время периодически синхронизируется, и если это так, с каким интервалом и с каким шагом оно обновляется (см. функцию GetSystemTimeAdjustment в MSDN).
Из этого я следую, что если я запрашиваю системное время, например, используяGetSystemTimeAsFileTime
повторяю, я должен либо не получать никаких изменений (системные часы не были обновлены), либо изменение, кратное приращению, полученномуGetSystemTimeAdjustment
. Вопрос первый: Это предположение верно?
Теперь рассмотрим следующий тестовый код:
#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;
}
Он принимает 20 временных меток в цикле и выводит их на консоль. В конце он печатает приращение, с которым обновляются системные часы. Я ожидаю, что разница между временными метками, напечатанными в цикле, будет равна 0 или кратна этому приращению. Тем не менее, я получаю такие результаты:
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
Таким образом, похоже, что системное время обновляется с использованием интервала около 0,0025 секунд, а не 0,0156 секунд, как возвращаютGetSystemTimeAdjustment
.
Вопрос второй: Что является причиной этого?