В моем проекте у меня есть функция, как определено ниже:
void start(std::chrono::milliseconds delay) override
{
mDelay = delay;
if (mThread == nullptr)
{
mThread = std::make_unique<Thread>([&]()
{
sleep(std::chrono::milliseconds(mDelay));
});
}
}
Когда я вызываю метод в первый раз, поток создается и засыпает на период mDelay. Но мне нужно снова изменить время mDelay, но на меньший период времени, чем был предоставлен ранее.
Но когда я вызываю его снова, я не могу отменить предыдущий сон и начать новый с определенным mDelay?
Как я могу добиться того же?
Это не решает вопрос, но вам здесь не нужен указатель. Используйте член: std::thread thr;. Когда объект построен, конструктор объекта потока по умолчанию создаст объект потока без потока выполнения. Вы можете проверить это с помощью thr.get_id() == std::thread::id(), и если ни один поток не был запущен, вы можете запустить его с thr = std::thread(/* your stuff */).
Ваш поток не имеет побочных эффектов; Самое простое решение - вообще не создавать поток. Если вы хотели, чтобы поток вызывал некоторый код («триггер»), прежде чем можно будет написать хороший ответ, вам нужно выразить, что происходит, когда (а) старый триггер уже сработал, (б) новая задержка сдвигает время триггера вверх, или (c) вниз, и (d) что должно произойти, если приложение закрывается во время ожидания. Также имеет значение природа триггера; это потокобезопасный? Может ли он заблокировать?





После того, как поток был создан в первый раз, mThread никогда не сбрасывается после того, как поток завершает свою работу. В следующий раз, когда вызывается start(), mThread больше не будет nullptr, и, таким образом, новый поток с обновленным delay не создается.
Либо лямбда Thread должна сбросить mThread до nullptr перед выходом, либо Thread нуждается в члене bool, который лямбда может установить перед выходом. В любом случае start() узнает, когда требуется новый поток.
Переместите и удалите старую ветку (с мобильного устройства, код не проверялся). Если поток должен запускать обработчик, просто поднимите флаг убитого, чтобы удаленный поток не запускался после того, как он был убит.
if (mThread != nullptr)
{
auto dispose = std::move(mThread);
dispose->detach();
mThread.reset(new Thread([&]()
{
sleep(std::chrono::milliseconds(mDelay));
});
}
Это похоже на совет, который будет генерировать код с условиями гонки повсюду.
вам нужен цикл событий, в котором службы будут передавать события в этот цикл. Одна из таких вещей -
boost::asio.