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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: многопоточность  (Прочитано 16289 раз)
StatuS74
Гость
« Ответ #15 : Июль 04, 2011, 13:44 »

ну да =) ты  просто капитан
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #16 : Июль 04, 2011, 18:46 »

1) Ещё раз повторюсь - GUI в потоках порождать нельзя:  QMessageBox::warning
2) Вы уверены, что функции FT_* потокобезопасны? Если нет, то вы их для разных хэнделов вызываете?
3) С какой ошибкой (или сообщением в консоль или хотя бы exit-кодом) оно собственно падает?
Записан
StatuS74
Гость
« Ответ #17 : Июль 05, 2011, 06:27 »

хендел один для всех. в инструкции к библиотеки через которую работаю написано что он до 100 приборов одновременно может обслуживать. ошибка что то типо "программа закрылась самостоятельно обратитесь в техническую поддержку"


возможно я потоки не првельно формирую

Код:
 if (chet_dat<=12)
       {    switch(chet_dat)
            {
            case 1:
               {

               QString name_file1 = "datchic1.txt";
               QFuture <void> future1a= QtConcurrent::run(tempiratura_datchika,tn1,name_file1,nms,ftHandle1,serial1);
              
               break;
                }
            case 2:
               {
               QString name_file2 = "datchic2.txt";

              QFuture <void> future2a = QtConcurrent::run(tempiratura_datchika,tn2,name_file2,nms,ftHandle1,serial2);
               break;
               }
            case 3:
               {
               QString name_file3 = "datchic3.txt";
               QFuture <void> future3a = QtConcurrent::run(tempiratura_datchika,tn3,name_file3,nms,ftHandle1,serial3);
               break;
               }
            case 4:
               {
               QString name_file4 = "datchic4.txt";
                QFuture <void> future4a = QtConcurrent::run( tempiratura_datchika,tn4,name_file4,nms,ftHandle1,serial4);

               break;
               }
            case 5:
               {
               QString name_file5 = "datchic5.txt";
               QFuture <void> future5a = QtConcurrent::run(  tempiratura_datchika,tn5,name_file5,nms,ftHandle1,serial5);

               break;
               }
            case 6:
               {
               QString name_file6 = "datchic6.txt";
               QFuture <void> future6a = QtConcurrent::run( tempiratura_datchika,tn6,name_file6,nms,ftHandle1,serial6);
               break;
               }
            case 7:
               {
               QString name_file7 = "datchic7.txt";
          
               QFuture <void> future7a = QtConcurrent::run( tempiratura_datchika,tn7,name_file7,nms,ftHandle1,serial7);

               break;
               }
            case 8:
               {
               QString name_file8 = "datchic8.txt";
            
               QFuture <void> future8a = QtConcurrent::run( tempiratura_datchika,tn8,name_file8,nms,ftHandle1,serial8);

               break;
               }
            case 9:
               {
               QString name_file9 = "datchic9.txt";
              
               QFuture <void> future9a = QtConcurrent::run(   tempiratura_datchika,tn9,name_file9,nms,ftHandle1,serial9);
               break;
               }
            case 10:
               {
               QString name_file10 = "datchic10.txt";
            
                QFuture <void> future10a = QtConcurrent::run(tempiratura_datchika,tn10,name_file10,nms,ftHandle1,serial10);

               break;
               }
            case 11:
               {
               QString name_file11 = "datchic11.txt";
          
               QFuture <void> future11a = QtConcurrent::run( tempiratura_datchika,tn11,name_file11,nms,ftHandle1,serial11);

               break;
               }
            case 12:
               {
                QString name_file12 = "datchic12.txt";
                QFuture <void> future12a = QtConcurrent::run(tempiratura_datchika,tn12,name_file12,nms,ftHandle1,serial12);

               break;
               }




Видимо потоки судя бланшету надо синхронизировать но вот как относительно моей программы
« Последнее редактирование: Июль 05, 2011, 07:00 от StatuS74 » Записан
StatuS74
Гость
« Ответ #18 : Июль 05, 2011, 07:21 »

консоль выдает следующее

ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file kernel\qwidget.cpp, line 1231
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file kernel\qwidget.cpp, line 1231
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
QObject::killTimers: timers cannot be stopped from another thread
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #19 : Июль 05, 2011, 08:30 »

консоль выдает следующее
Повторяю в третий раз:
GUI в потоках порождать нельзя
Уберите QMessageBox::warning (и любое другое прямое обращение к GUI из этих функций).
в инструкции к библиотеки через которую работаю написано что он до 100 приборов одновременно может обслуживать.
100 приборов - это одно дело, а вот один и тот же прибор в нескольких потоках - совсем другое.
Записан
StatuS74
Гость
« Ответ #20 : Июль 05, 2011, 08:34 »

хендел это программатор =) он служит как средство обмена данных между приборами и программой скажем там
Записан
StatuS74
Гость
« Ответ #21 : Июль 05, 2011, 08:43 »

убрал их... теперь не падает но и паралельной работы программы нет =((
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #22 : Июль 05, 2011, 10:23 »

Ошибки можете в консоль приложения выводить через qDebug вместо QMessageBox::warning.
Записан
StatuS74
Гость
« Ответ #23 : Июль 06, 2011, 05:55 »

так мне надо что  бы пользователь видел в чем он накасячил при работе с программой
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #24 : Июль 06, 2011, 07:10 »

Читай про QThread, сигналы/слоты и про многопоточное программирование в Qt.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #25 : Июль 06, 2011, 08:03 »

так мне надо что  бы пользователь видел в чем он накасячил при работе с программой
Это для себя, что бы разобраться, почему «но и паралельной работы программы нет». Кстати, вы учитываете, что потоков по умолчанию будет столько, сколько у вас в компьютере ядер у процессора? А если нужно больше, то это надо настраивать?
А сообщения пользователю - можно через сигналы слоты, можно через сигналы слоты. Можно через общий буффер, защищённый, скажем мьютексом. Варианты есть. Просто лучше вначале отладить одно, а потом писать другое.
Записан
StatuS74
Гость
« Ответ #26 : Июль 06, 2011, 11:10 »

а как настроить поток если на 1 ядре будет программа ?
Записан
ddrtn
Гость
« Ответ #27 : Июль 06, 2011, 12:46 »

а как настроить поток если на 1 ядре будет программа ?

Независимо от количество работающих ядер можно запускать произвольное количество потоков (точнее ограниченное ОС, но, обычно, не 2-3 потока).

Более того, учитывая, что во время работы ОС суммарное количество всех запущенных потоков всех запущенных процессов, к гадалке не ходи, будет перекрывать количество ядер, - настоящего параллелизма на уровне системы никогда не будет.

Для пользовательской же программы все ее запущенные потоки работают параллельно.

Кстати, отследить по логам "параллельность" работы программы при незначительных по времени операциях, выполняемых в отдельных потоках, часто бывает сложно.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #28 : Июль 06, 2011, 16:00 »

а как настроить поток если на 1 ядре будет программа ?
QThreadPool::globalInstance()->setMaxThreadCount( x );
где x - нужное число потоков.

Независимо от количество работающих ядер можно запускать произвольное количество потоков (точнее ограниченное ОС, но, обычно, не 2-3 потока).
Можно, кто ж спорит, но QtConcurrent::run() по умолчанию будет запускать QThread::idealThreadCount() потоков, что для одноядерной машины равно 1.
Записан
StatuS74
Гость
« Ответ #29 : Июль 07, 2011, 11:34 »

неожиданно случилась проблема =)
Код:
 QFuture <void> future1a= QtConcurrent::run(tempiratura_datchika,tn1,name_file1,nms,ftHandle1,serial1,tk1);
в этой функции всё работало но как только я добавил tk1. компилятор начал выдавать ошибку
no matching function for call to run ...

если этот агумент убрать то всё работает.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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