Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: qtkoder777 от Май 18, 2017, 16:38



Название: Поток ставит сам себя на паузу и ждёт изменения переменной
Отправлено: qtkoder777 от Май 18, 2017, 16:38
Как реализовать такую схему на базе QtConcurrent?
Пока сделал так. Поток посылает сигнал и крутится в цикле пока resume_=0, по сигналу вылезает MessageBox, если пользователь ответил да, resume_ ставится в 1, если нет, то в 2.

Код
C++ (Qt)
class Thread
{
public:
   int resume_;
   Thread(){resume_=0;}
   void startThread()
   {
         QtConcurrent::run(this, &Thread::ThreadFunc);
   }
   void ThreadFunc()
   {
       emit ask("Продолжить выполнение?");
       qApp->processEvents();
       resume_ = 0;
       while(resume_ == 0)
       {
            ;
       }
       if(resume_ == 1) _result = continueThread();
   }
   void continueThread()
   {
   }
   void resumeThread(bool b)
   {
        resume_ = b ? 1 : 2;
   }
signals:
   void ask(const QString &)
};

Можно предложить что-то лучше?



Название: Re: Поток ставит сам себя на паузу и ждёт изменения переменной
Отправлено: ViTech от Май 18, 2017, 16:48
QWaitCondition (http://doc.qt.io/qt-5/qwaitcondition.html), std::condition_variable (http://en.cppreference.com/w/cpp/thread/condition_variable).


Название: Re: Поток ставит сам себя на паузу и ждёт изменения переменной
Отправлено: Авварон от Май 19, 2017, 02:09
Через футуру можно запаузить. Но придется опять promise (QFutureInterface) юзать


Название: Re: Поток ставит сам себя на паузу и ждёт изменения переменной
Отправлено: Igors от Май 19, 2017, 09:12
Цитировать
QtConcurrent::run(this, &Thread::ThreadFunc);
Не помню такого вызова/синтаксиса, ну ладно, не суть

Простой но малодушный способ - вставить sleep в тело while. Нормальное решение - ждать на семафоре (члене класса). Ну и как-то организовать разумно, чего спрашивать если только стартовали? Напр
Код
C++ (Qt)
void ThreadFunc( void )
{
// считаем
// ...
 
 if (needAsk) {
   resume_ = reply_ask;
   emit ask("Продолжить выполнение?");
   mSemaphore.acquire();  
   if (resume_ == reply_cancel) return;  
 }
 
// продолжаем считать
// ...
}
 
// этот метод выполняется из др нитки, возможно главной
void resumeThread( bool doContinue )
{
  Q_ASSERT(resume_ == reply_ask);
  resume_ = doContinue ? reply_continue : reply_cancel;
  mSemaphore.release();
}


Название: Re: Поток ставит сам себя на паузу и ждёт изменения переменной
Отправлено: qtkoder777 от Май 19, 2017, 16:05
А потоку не плевать на захваченный им самим семафор?
Почему на семафоре, а не на мьютексе?


Название: Re: Поток ставит сам себя на паузу и ждёт изменения переменной
Отправлено: Igors от Май 19, 2017, 16:38
А потоку не плевать на захваченный им самим семафор?
Почему на семафоре, а не на мьютексе?
Семафор не захватывается, а просто "пропускает" или нет, что здесь и требуется. С упомянутым QWaitCondition все будет не так просто