Как изменить время сна - PullRequest
       2

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

0 голосов
/ 26 августа 2018

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

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?

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

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

Переместите и утилизируйте старую ветку (с мобильного, код не проверен). Если поток запускает обработчик, просто поднимите флаг уничтожения, чтобы удаленный поток не сработал после уничтожения.

 if(mThread != nullptr)
 {
     auto dispose = std::move(mThread);
     dispose->detach();
     mThread.reset(new Thread([&]()
    {
        sleep(std::chrono::milliseconds(mDelay));
    });
  }
0 голосов
/ 26 августа 2018

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

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

0 голосов
/ 26 августа 2018

Как только поток был создан впервые, mThread никогда не сбрасывается после того, как поток завершает свою работу. В следующий раз, когда вызывается start(), mThread больше не является nullptr, и поэтому новый поток не создается с обновленным delay.

Либо лямбда Thread должна сбросить mThread до nullptr перед выходом, либо Thread нуждается в элементе bool, который лямбда может установить перед выходом. В любом случае start() будет знать, когда нужен новый поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...