Мне нужно ждать в моей программе подсистемы.В разных местах приходится ждать разных условий.Я знаю, что мог бы также использовать переменные потоков и условий.Но так как подсистема (запрограммированная в C на «голом железе») подключена через разделяемую память без прерываний, зарегистрированных в ней - один поток все равно должен опрашивать.
Итак, я сделал следующий шаблон, чтобы иметь возможность ждать чего-либо.Мне было интересно, есть ли уже функция STL, которая может быть использована для этого?
#include <chrono>
#include <thread>
//given poll interval
template<typename predicate,
typename Rep1, typename Period1,
typename Rep2, typename Period2>
bool waitActiveFor(predicate check,
std::chrono::duration<Rep1, Period1> x_timeout,
std::chrono::duration<Rep2, Period2> x_pollInterval)
{
auto x_start = std::chrono::steady_clock::now();
while (true)
{
if (check())
return true;
if ((std::chrono::steady_clock::now() - x_start) > x_timeout)
return false;
std::this_thread::sleep_for(x_pollInterval);
}
}
//no poll interval defined
template<typename predicate,
typename Rep, typename Period>
bool waitActiveFor(predicate check,
std::chrono::duration<Rep, Period> x_timeout)
{
auto x_start = std::chrono::steady_clock::now();
while (true)
{
if (check())
return true;
if ((std::chrono::steady_clock::now() - x_start) > x_timeout)
return false;
std::this_thread::yield();
}
}
пример выполнения
2019-05-23: обновление кода для комментариев и ответов