我需要引入最少2秒的延迟。为此我做了这个:
typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::milliseconds Milliseconds;
Clock::time_point t0 = Clock::now();
// DO A LOTS OF THINGS HERE.....
Clock::time_point t1 = Clock::now();
Milliseconds delayTime = Milliseconds(2000) -
std::chrono::duration_cast<Milliseconds>(t1 - t0);
// Check if time left from initial 2 seconds wait the difference
if (delayTime > Milliseconds(0))
{
std::this_thread::sleep_for(delayTime);
}
如果还剩下时间,我是否正确检查了?
答案 0 :(得分:5)
除非你确实需要确保如果2秒已经过去就根本不打电话给睡眠,那么当睡眠时应该更容易计算结束,然后调用sleep_until
,传递那段时间。
auto t1 = Clock::now() + 2s; // beware: requires C++14
// do lots of things here
std::this_thread::sleep_until(t1);
如果已经过了2秒,则sleep_until
(至少可能)立即返回。如果它还没有过去,则线程会一直睡到指定的时间。
答案 1 :(得分:2)
这样的事情应该可以解决问题,即使你的尝试看起来是正确的:
typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::milliseconds Milliseconds;
Clock::time_point t0 = Clock::now();
// DO A LOTS OF THINGS HERE.....
Clock::time_point t1 = Clock::now();
auto elapsed_time = std::chrono::duration_cast<Milliseconds>(t1 - t0);
auto duration = Milliseconds(2000);
// Check if time left from initial 2 seconds wait the difference
if (elapsed_time < duration)
{
std::this_thread::sleep_for(duration - elapsed_time);
}