Russian Qt Forum

Qt => Вопросы новичков => Тема начата: StatuS74 от Август 03, 2011, 12:28



Название: QtConcurrent
Отправлено: StatuS74 от Август 03, 2011, 12:28
Код:
 QString name_file1 = "datchic1.txt";
              QFuture <bool> future1a= QtConcurrent::run(tempiratura_datchika,tn1,name_file1,nms,ftHandle1,serial1);
             if (future1a==true)
                {
                     QFuture <int> start_tect1= QtConcurrent::run(Start_test,tk1,name_file1,nms,ftHandle1,serial1);
                     //Tyd1=Tyd1-start_tect1;
                     if (start_tect1==1)
                    {
                     QFuture <void> test_times1 = QtConcurrent::run(time_test_2,Tyd1,name_file1,ftHandle1,serial1);
                    }
                 }
суть вопроса в том что мне надо что бы при выполнении этих функций программа позволяла выполнять другие действия. а так как она проверяет условия то программа"подвисает". как избавится от этого недуга ???


Название: Re: QtConcurrent
Отправлено: StatuS74 от Август 03, 2011, 14:33
ни кто не сталкивался с подобной штукой ??


Название: Re: QtConcurrent
Отправлено: Пантер от Август 03, 2011, 14:38
Не проверять условия.

//Ваш К.О.


Название: Re: QtConcurrent
Отправлено: zenden от Август 03, 2011, 15:01
Когда вы научитесь вопросы грамотно задавать? Что такое "поваляла"?
Я ничего не понял!


Название: Re: QtConcurrent
Отправлено: Igors от Август 03, 2011, 15:15
Код
C++ (Qt)
QFutureWatcher <bool> mWatcher;  // член класса
...
// запускаем
QObject::connect(theWatcher, SIGNAL(finished), this, SLOT(tempiratura_datchika_finished));  // this и имя слота поменять на что нужно
mWatcher.setFuture(QtConcurrent::run(tempiratura_datchika,tn1,name_file1,nms,ftHandle1,serial1));
 
А в слоте tempiratura_datchika_finished взять mWatcher.result. Все это громоздко и не очень удобно - потому что QtConcurrent хорош когда запускаемых задач "много" - а когда как у Вас так проще и лучше сделать на QThread

Что такое "поваляла"?
Я ничего не понял!
Ну захотела и "поваляла" - хорошо хоть не "попробЫвала"  :)


Название: Re: QtConcurrent
Отправлено: LisandreL от Август 03, 2011, 15:17
Как вариант:
Код
C++ (Qt)
while ( !future1a.isFinished() )
{
   QCoreApplication::processEvents();
}
if (future1a==true)
...


Название: Re: QtConcurrent
Отправлено: StatuS74 от Август 04, 2011, 07:13
выполняемых задач какраз то ки много. просто если убрать условия то  они начинают выполнятся не одна за другой а сразу одновременно все.


Название: Re: QtConcurrent
Отправлено: Пантер от Август 04, 2011, 07:23
StatuS74: используй QFutureWatcher. И вообще, читай ассистент.


Название: Re: QtConcurrent
Отправлено: Igors от Август 04, 2011, 08:14
выполняемых задач какраз то ки много. просто если убрать условия то  они начинают выполнятся не одна за другой а сразу одновременно все.
Может и много, но у Вас выполнение следующей задачи зависит от результата предыдущей - поэтому QtConcurrent только мешает. Заведите просто объект и для него слоты (параметры каждой из задач) и сигналы (такая-то задача закончилась). Потом создаете QThread и в нее помещаете Ваш объект (mobeToThread). Запускаете QThread и посылаете объекту первую задачу (сигналом). Когда придет сигнал "задача завершена" - посылаете следующую и.т.д.