Нить, которая спит в течение X миллисекунд, не гарантирует спать ровно столько миллисекунд. Я предполагаю, что у вас есть заявление, что идет что-то вроде:
while(1) {
...
sleep(10); // Sleep for 10 seconds.
// fetch timestamp and send
}
Вы получите более точную меру времени, если вы спите на более короткие периоды (скажем 20 миллисекунд) в цикле проверки, пока время не истекло. Когда вы спите в течение 10 секунд, ваш поток перемещается дальше от приоритета немедленного планирования базовой ОС.
Вы также можете учесть, что время, затрачиваемое на отправку меток времени, может меняться в зависимости от условий сети и т. Д., Если вы выполняете тип цикла (10) -> send -> sleep (10), время, затраченное на отправку, будет добавлено в следующий сон (10) в реальном выражении.
Попробуйте что-то вроде этого (простите меня, мой C является немного ржавым):
bool expired = false;
double last, current;
double t1, t2;
double difference = 0;
while(1) {
...
last = (double)clock();
while(!expired) {
usleep(200); // sleep for 20 milliseconds
current = (double)clock();
if(((current - last)/(double)CLOCKS_PER_SEC) >= (10.0 - difference))
expired = true;
}
t1 = (double)clock();
// Set and send the timestamp.
t2 = (double)clock();
//
// Calculate how long it took to send the stamps.
// and take that away from the next sleep cycle.
//
difference = (t2 - t1)/(double)CLOCKS_PER_SEC;
expired = false;
}
Если вы не удосужились об использовании стандартной библиотеки C, вы можете посмотреть с помощью функции таймера высокого разрешения таких как QueryPerformanceFrequency/QueryPerformanceCounter.
LONG_INTEGER freq;
LONG_INTEGER t2, t1;
//
// Get the resolution of the timer.
//
QueryPerformanceFrequency(&freq);
// Start Task.
QueryPerformanceCounter(&t1);
... Do something ....
QueryPerformanceCounter(&t2);
// Very accurate duration in seconds.
double duration = (double)(t2.QuadPart - t1.QuadPart)/(double)freq.QuadPart;
Я не уверен, в чем проблема. Вы спите 10 секунд, чтобы получить время и найти разницу не всегда 10 секунд? – Artefacto
Да, мой поток в течение 10 секунд после этого снова получает время UTC и отправляет. – Siddiqui