Dyikot
@Dyikot

Баг при подсчете времени? Или как это объяснить?

Реализую свой таймер, который считает в отдельном потоке.
Сделал 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;
закомментирована:
66f56ec52d9fc352134254.png
и если нет:
66f56ef31da0f928122523.png

Как?
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?
  • Вопрос задан
  • 98 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы