Dyikot
@Dyikot

Как исправить ошибки вызова обработчика событий в другом потоке?

Имеется таймер, который считается в другом потоке. У него есть событие Elapsed( можете считать это std::list<std::function<T>>) которое вызывает в том же потоке где и считается.
int main()
{
	std::chrono::milliseconds duration(150);
	Timer t = duration;
	t.Elapsed += &OnElapsed;
	t.Start();
	
	std::this_thread::sleep_for(duration);
}

Ошибки

673c6b8bc560a991720027.png
673c6b93aae7b270728494.png
673c6b9944335156149146.png
Ошибки могут появлятся если поставить duration одинаковый для таймера и для sleep_for. В других случаях ошибок не обнаружил. Первая почему появляется не совсем ясно. Вторые думаю связаны с тем что функции в std::function нету? (удалилась уже?)
Возможно ли после окончания таймера вызвать из main потока обработчик не опрашивая специально (т.е. истекло ли время)?
Если нужно вот код счета

void Timer::WaitOnSeparateThread()
{
	std::mutex mutex;
	std::condition_variable conditionVariable;

	_start = high_resolution_clock::now();

	std::unique_lock<std::mutex> lock(mutex);
	conditionVariable.wait_for(lock, Duration - _timeElapsed,
							   std::bind_front(&Timer::IsPaused, this));

	_timeElapsed += duration_cast<milliseconds>(high_resolution_clock::now() - _start);
	_isElapsed = !_isPaused;

	if(_isElapsed)
	{
		OnTimerElapsed(this, TimeElapsedEventArgs{ .Duration = Duration });
	}
}

  • Вопрос задан
  • 46 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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