Russian Qt Forum
Март 29, 2024, 00:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Поток ставит сам себя на паузу и ждёт изменения переменной  (Прочитано 4959 раз)
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« : Май 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 &)
};

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

« Последнее редактирование: Май 18, 2017, 16:39 от qtkoder777 » Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #1 : Май 18, 2017, 16:48 »

QWaitCondition, std::condition_variable.
Записан

Пока сам не сделаешь...
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #2 : Май 19, 2017, 02:09 »

Через футуру можно запаузить. Но придется опять promise (QFutureInterface) юзать
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Май 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();
}
Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #4 : Май 19, 2017, 16:05 »

А потоку не плевать на захваченный им самим семафор?
Почему на семафоре, а не на мьютексе?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Май 19, 2017, 16:38 »

А потоку не плевать на захваченный им самим семафор?
Почему на семафоре, а не на мьютексе?
Семафор не захватывается, а просто "пропускает" или нет, что здесь и требуется. С упомянутым QWaitCondition все будет не так просто
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.092 секунд. Запросов: 22.