Самый простой способ иметь следующий таймер

В настоящее время я пытаюсь переписать некоторое программное обеспечение на С++ из старого кода Python. В версии Python у меня были такие таймеры:

from time import time, sleep

t_start = time()
while (time()-t_start < 5) # 5 second timer
    # do some stuff
    sleep(0.001) #Don't slam the CPU

sleep(1)
print time()-t_start # would print something like 6.123145 notice the precision!

Однако в C++, когда я пытаюсь использовать time(0) из < time.h >, я могу получить точность в секундах только как целое число, а не с плавающей запятой.

#include <time.h>
#include <iostream>

time_t t_start = time(0)
while (time(0) - t_start < 5) // again a 5 second timer.
{
    // Do some stuff 
    sleep(0.001) // long boost sleep method.
}
sleep(1);
std::cout << time(0)-t_start; // Prints 6 instead of 6.123145

Я также пробовал gettimeofday(struct, NULL) из < sys/time.h >, однако всякий раз, когда я сплю программу с boost::this_thread::sleep, это время не считается...

Я надеюсь, что кто-то здесь сталкивался с подобной проблемой и нашел решение.

Кроме того, мне действительно нужен dt с точностью не менее миллисекунды, потому что в

// Do some stuff

часть кода, я могу выйти из цикла while раньше, и мне нужно знать, как долго я был внутри и т. д.

Спасибо за чтение!


person ch0l1n3    schedule 19.02.2015    source источник
comment
Вы не получаете результат с плавающей запятой, потому что time_t является целочисленным типом в соответствии с заголовком stackoverflow.com/questions/471248/   -  person Tony J    schedule 19.02.2015


Ответы (1)


Известно, что gettimeofday() возникают проблемы при прерывистых скачках в системное время.

Чтобы узнать о переносимой точности в миллисекундах, см. chrono::high_resolution_clock()

Вот небольшой фрагмент:

chrono::high_resolution_clock::time_point ts = chrono::high_resolution_clock::now();
chrono::high_resolution_clock::time_point te = chrono::high_resolution_clock::now();
// ... do something ...
cout << "took " << chrono::duration_cast<chrono::milliseconds>(te - ts).count() << " millisecs\n";

Обратите внимание, что реальное разрешение часов зависит от операционной системы. Например, в Windows у вас обычно есть точность 15 мс, и вы можете выйти за пределы этого ограничения, только используя системы синхронизации, зависящие от платформы.

person Christophe    schedule 19.02.2015
comment
Можно ли сохранить разницу как двойную?? - person ch0l1n3; 19.02.2015
comment
необходимо упомянуть boost::chrono для Windows (я полагаю, что CTP MSVS2015 может исправить разрешение?). - person sehe; 19.02.2015
comment
@ch0l1n3 c::duration_cast<c::milliseconds>(duration).count()/1000.0 например (c=std::хроно) - person sehe; 19.02.2015
comment
Ну вот так? double dt = chrono::duration_cast‹chrono::milliseconds›(te - ts).count()/1000.0 Кроме того, я использую Linux, поэтому, возможно, проблема с разрешением отличается! - person ch0l1n3; 19.02.2015
comment
Насколько я понимаю, chrono::high_resolution_clock не обязательно будет "устойчивым" и не "прыгающим". - person Persixty; 19.02.2015