Я реализовал следующую функцию:
bool ResponsiveSleep(atomic<bool>& flag, const float nSeconds, const float grainSec=0.1f)
{
auto tpUntil = chrono::steady_clock::now() + chrono::duration<float>(nSeconds);
while (chrono::steady_clock::now() < tpUntil) {
if (flag.load(memory_order::acquire)) {
return true;
}
this_thread::sleep_for(chrono::duration<float>(grainSec));
}
return flag.load(memory_order::acquire);
}
И я вызываю это так, чтобы спать на 5 секунд:
atomic<bool> flag = false;
cout << "Start sleeping: " << double(clock()) / CLOCKS_PER_SEC << endl;
TimeUtils::ResponsiveSleep(flag, 5);
cout << "Stop sleeping: " << double(clock()) / CLOCKS_PER_SEC << endl;
Однако я получаю случайные сны От 20 до 40 секунд. Система: Windows 10, MSVC ++ 2019 v16.5.3
Не могли бы вы помочь решить эту проблему? Я предполагаю, что chrono::duration<float>(x)
на самом деле не ожидает количество секунд, равное x
, однако ранее я нашел примеры, предполагающие это.