Имеется таймер, который считается в другом потоке. У него есть событие 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);
}
Ошибки
могут появлятся если поставить 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 });
}
}