Реализую свой таймер, который считает в отдельном потоке.
Сделал 2 функции:
1) При длительности > 100мс использую conditional variable и там все ок.
2) В другом случае решил считать в прямую.
Вот функция для 2 способа:
void Timer::WaitByYield()
{
auto start = high_resolution_clock::now();
auto time = 0us;
do
{
std::this_thread::yield();
time += duration_cast<microseconds>(high_resolution_clock::now() - start);
start = high_resolution_clock::now();
//std::cout << duration_cast<milliseconds>(time) << std::endl;
}
while(time < Duration && !_isPaused);
_isElapsed = !_isPaused;
}
Main:
using namespace std::chrono_literals;
using namespace std::chrono;
int main()
{
Sgl::Timer t(10ms);
t.Start();
auto start = high_resolution_clock::now();
while(!t.Elapsed())
{
}
std::cout << "Elapsed time: ";
std::cout << duration_cast<milliseconds>(high_resolution_clock::now() - start);
}
Вывод если эта строка
//std::cout << duration_cast<milliseconds>(time) << std::endl;
закомментирована:
и если нет:
Как?
UPD: Изменил код на:
auto start = high_resolution_clock::now();
while(steady_clock::now() - start + _timeElapsed < Duration && !_isPaused)
{
std::this_thread::yield();
}
_timeElapsed = duration_cast<milliseconds>(steady_clock::now() - start);
_isElapsed = !_isPaused;
Концептуально все тоже. Но все работает корректно. Почему? Из-за частых duration_cast?