Тема как изменить время сна

В моем проекте у меня есть функция, как определено ниже:

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?

Как я могу добиться того же?

вам нужен цикл событий, в котором службы будут передавать события в этот цикл. Одна из таких вещей - boost::asio.

Richard Hodges 26.08.2018 18:38

Это не решает вопрос, но вам здесь не нужен указатель. Используйте член: std::thread thr;. Когда объект построен, конструктор объекта потока по умолчанию создаст объект потока без потока выполнения. Вы можете проверить это с помощью thr.get_id() == std::thread::id(), и если ни один поток не был запущен, вы можете запустить его с thr = std::thread(/* your stuff */).

Pete Becker 26.08.2018 18:45

Ваш поток не имеет побочных эффектов; Самое простое решение - вообще не создавать поток. Если вы хотели, чтобы поток вызывал некоторый код («триггер»), прежде чем можно будет написать хороший ответ, вам нужно выразить, что происходит, когда (а) старый триггер уже сработал, (б) новая задержка сдвигает время триггера вверх, или (c) вниз, и (d) что должно произойти, если приложение закрывается во время ожидания. Также имеет значение природа триггера; это потокобезопасный? Может ли он заблокировать?

Yakk - Adam Nevraumont 26.08.2018 21:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
114
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

После того, как поток был создан в первый раз, 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));
    });
  }

Это похоже на совет, который будет генерировать код с условиями гонки повсюду.

Yakk - Adam Nevraumont 26.08.2018 21:45

Я вижу, что вы пытаетесь сделать, я считаю, что std::condition_variable - это то, что вы ищете.

Вместо сна можно вызвать в wait_for. Если вы хотите разбудить поток, вы можете вызвать notify_one.

Другие вопросы по теме