я знаю это GetTickCount()
а также timeGetTime()
имеют разные разрешения и что разрешение таймера timeGetTime()
можно установить с помощью звонков на timeBeginPeriod()
,
Насколько я понимаю, увеличение разрешения таймера с помощью timeBeginPeriod()
уменьшает время сна системы между последовательными приращениями к счетчику позади timeGetTime()
,
Скажем, разрешение по времени GetTickCount()
16 мс (его значение увеличивается на 16 каждые 16 мс), и я установил разрешение timeGetTime()
до 1 мс (его значение увеличивается на 1 каждые 1 мс). Мой вопрос о времени, в которое счетчик тиков обновляется. Я написал небольшую тестовую программу, чтобы увидеть, какое отставание имеет таймер за счетчиком тиков в момент увеличения счетчика тиков. С лагом я имею ввиду разницу GetTickCount()
— timeGetTime()
прямо когда GetTickCount()
Обновления. Например. задержка 0 будет означать, что счетчик обновляется с 16 до 32, когда функция timeGetTime()
возвращает 32, отставание 4 означает, что счетчик тиков увеличивается с 16 до 32, когда timeGetTime()
возвращает 28. Вот код:
#include <windows.h>
#include <iostream>
#include <vector>
int main(void) {
// set time resolution to 1ms
timeBeginPeriod(1);
// measure tick counter interval for low resolution
std::vector<int> difftime(200);
int lasttick;
for (int i = 0; i < 200; ++i) {
lasttick = GetTickCount();
while (!(GetTickCount()-lasttick)) ;
difftime[i] = GetTickCount() - timeGetTime();
}
// reset timer resolution
timeEndPeriod(1);
// printout
std::cout << "timediff" << std::endl;
for (int i = 0; i < 200; ++i) {
std::cout << difftime[i] << std::endl;
}
return 0;
}
Что меня удивило, так это то, что, хотя задержка между двумя функциями постоянна во время одного запуска моей программы, она сильно варьируется в зависимости от повторного выполнения программы. Я ожидал, что счетчики этих двух функций всегда будут работать в фоновом режиме, поэтому я решил, что задержка должна быть постоянной между выполнениями.
Сначала я подумал, что увеличение разрешения timeGetTime()
-Timer может вызвать это, вводя некоторую случайную задержку между двумя, но когда я оставляю разрешение в 1 мс между выполнениями, задержка все еще варьируется между выполнениями.
Кто-нибудь знает, какой механизм вызывает такое поведение?
Задача ещё не решена.
Других решений пока нет …