Название: многопоточность Отправлено: StatuS74 от Июня 28, 2011, 13:08 вопрос в следующем. Иследовав форум там и не нашел ответ на интересующий меня вопрос.
у меня есть программа в ней есть 12 кнопок которые надо разбить на потоке что бы одновременно могли выполнятся все 12 операций (по количеству кнопок).суть в том что мне надо это сделать без классов ибо ризона нет создавать на каждые 4 строчки по классу которые выполняются всего 1 раз. подскажите.в ассистенте читал тоже не получил толком ответа. Название: Re: многопоточность Отправлено: kuzulis от Июня 28, 2011, 13:15 QtConcurrent::Run()
Название: Re: многопоточность Отправлено: StatuS74 от Июня 28, 2011, 13:28 а приме можеш привести ?
Название: Re: многопоточность Отправлено: LisandreL от Июня 28, 2011, 13:35 http://doc.crossplatform.ru/qt/4.6.x/qtconcurrentrun.html
Название: Re: многопоточность Отправлено: StatuS74 от Июня 28, 2011, 14:16 а какие параметры у QtConcurrent::Run() и куда её вставлять ?
как бы понятно что там функции. а если у меня цикл типо for (int i=1;i<3000;i++) { int a = a + i; } (этот пример на угад, там год посложнее =)) как быть в таком случии и мне на 12 кнопок такое надо сделать =) но без класса Название: Re: многопоточность Отправлено: LisandreL от Июня 28, 2011, 14:24 а какие параметры у QtConcurrent::Run() и куда её вставлять ? Функция, которая будет выполняться, её параметры.Всё есть по приведённой ссылке: 1) запуск просто функции, 2) запуск функции с параметрами, 3) запуск функции и получение результата по окончании, 4) запуск функции объекта. Название: Re: многопоточность Отправлено: StatuS74 от Июня 28, 2011, 14:28 а как указать в данном примере ?
Название: Re: многопоточность Отправлено: Пантер от Июня 28, 2011, 14:32 facepalm (http://www.google.ru/imgres?imgurl=http://www.gamer.ru/system/attached_images/images/000/294/008/original/facepalm2.jpg%3F1292607255&imgrefurl=http://www.gamer.ru/portal-2/rasshirennyy-treyler-portal-2&h=600&w=750&sz=71&tbnid=wJODyEG7oK-jTM:&tbnh=113&tbnw=141&prev=/search%3Fq%3Dfacepalm%26tbm%3Disch%26tbo%3Du&zoom=1&q=facepalm&hl=ru&usg=__xtQfXUfO98luCE3uEnuTA_ZL6UU=&sa=X&ei=arsJTtG6KovtOe3UgKQB&sqi=2&ved=0CDMQ9QEwAg)
Ну, научись же искать (http://doc.qt.nokia.com/4.7/qtconcurrent-runfunction.html) Название: Re: многопоточность Отправлено: StatuS74 от Июня 28, 2011, 14:34 это не совсем то что мне нужно.... искал и то что надо не нашол. точнее нашол не понял как юзать это
Название: Re: многопоточность Отправлено: LisandreL от Июня 28, 2011, 14:36 как бы понятно что там функции. а если у меня цикл типо Код
Название: Re: многопоточность Отправлено: LisandreL от Июня 29, 2011, 14:26 1) Эта функция член класса? Если нет, то откуда он вам this возьмёт?
2) GUI нельзя попрождать не в главном потоке - всё равно ж это будет следующий вопрос. Название: Re: многопоточность Отправлено: StatuS74 от Июля 04, 2011, 12:31 проблема в следующем.. вызываю эту функцию в одном потоке все равботает.. а как только вызываю в 2-х и более спустя секунд 30 всё валится... функция вызывается примерно 1 раз в секунду..
Код: //+++++++функция обработки данных и получения с датчика Название: Re: многопоточность Отправлено: BRE от Июля 04, 2011, 13:35 Код
Дальше пока не смотрел... Название: Re: многопоточность Отправлено: StatuS74 от Июля 04, 2011, 13:40 отвечу кратко. так надо..-5 потому что лрц это контрольная сумма при обмене с датчиком а 5 символов последнии в сумму не входят...
Название: Re: многопоточность Отправлено: kambala от Июля 04, 2011, 13:42 тут у тебя не входят первые 5 и последние 5 символов
Название: Re: многопоточность Отправлено: StatuS74 от Июля 04, 2011, 13:44 ну да =) ты просто капитан
Название: Re: многопоточность Отправлено: LisandreL от Июля 04, 2011, 18:46 1) Ещё раз повторюсь - GUI в потоках порождать нельзя:
2) Вы уверены, что функции FT_* потокобезопасны? Если нет, то вы их для разных хэнделов вызываете? 3) С какой ошибкой (или сообщением в консоль или хотя бы exit-кодом) оно собственно падает? Название: Re: многопоточность Отправлено: StatuS74 от Июля 05, 2011, 06:27 хендел один для всех. в инструкции к библиотеки через которую работаю написано что он до 100 приборов одновременно может обслуживать. ошибка что то типо "программа закрылась самостоятельно обратитесь в техническую поддержку"
возможно я потоки не првельно формирую Код: if (chet_dat<=12) Видимо потоки судя бланшету надо синхронизировать но вот как относительно моей программы Название: Re: многопоточность Отправлено: StatuS74 от Июля 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 Название: Re: многопоточность Отправлено: LisandreL от Июля 05, 2011, 08:30 консоль выдает следующее Повторяю в третий раз:GUI в потоках порождать нельзя Уберите QMessageBox::warning (и любое другое прямое обращение к GUI из этих функций). в инструкции к библиотеки через которую работаю написано что он до 100 приборов одновременно может обслуживать. 100 приборов - это одно дело, а вот один и тот же прибор в нескольких потоках - совсем другое.Название: Re: многопоточность Отправлено: StatuS74 от Июля 05, 2011, 08:34 хендел это программатор =) он служит как средство обмена данных между приборами и программой скажем там
Название: Re: многопоточность Отправлено: StatuS74 от Июля 05, 2011, 08:43 убрал их... теперь не падает но и паралельной работы программы нет =((
Название: Re: многопоточность Отправлено: LisandreL от Июля 05, 2011, 10:23 Ошибки можете в консоль приложения выводить через qDebug вместо QMessageBox::warning.
Название: Re: многопоточность Отправлено: StatuS74 от Июля 06, 2011, 05:55 так мне надо что бы пользователь видел в чем он накасячил при работе с программой
Название: Re: многопоточность Отправлено: Пантер от Июля 06, 2011, 07:10 Читай про QThread, сигналы/слоты и про многопоточное программирование в Qt.
Название: Re: многопоточность Отправлено: LisandreL от Июля 06, 2011, 08:03 так мне надо что бы пользователь видел в чем он накасячил при работе с программой Это для себя, что бы разобраться, почему «но и паралельной работы программы нет». Кстати, вы учитываете, что потоков по умолчанию будет столько, сколько у вас в компьютере ядер у процессора? А если нужно больше, то это надо настраивать?А сообщения пользователю - можно через сигналы слоты, можно через сигналы слоты. Можно через общий буффер, защищённый, скажем мьютексом. Варианты есть. Просто лучше вначале отладить одно, а потом писать другое. Название: Re: многопоточность Отправлено: StatuS74 от Июля 06, 2011, 11:10 а как настроить поток если на 1 ядре будет программа ?
Название: Re: многопоточность Отправлено: ddrtn от Июля 06, 2011, 12:46 а как настроить поток если на 1 ядре будет программа ? Независимо от количество работающих ядер можно запускать произвольное количество потоков (точнее ограниченное ОС, но, обычно, не 2-3 потока). Более того, учитывая, что во время работы ОС суммарное количество всех запущенных потоков всех запущенных процессов, к гадалке не ходи, будет перекрывать количество ядер, - настоящего параллелизма на уровне системы никогда не будет. Для пользовательской же программы все ее запущенные потоки работают параллельно. Кстати, отследить по логам "параллельность" работы программы при незначительных по времени операциях, выполняемых в отдельных потоках, часто бывает сложно. Название: Re: многопоточность Отправлено: LisandreL от Июля 06, 2011, 16:00 а как настроить поток если на 1 ядре будет программа ? QThreadPool::globalInstance()->setMaxThreadCount( x );где x - нужное число потоков. Независимо от количество работающих ядер можно запускать произвольное количество потоков (точнее ограниченное ОС, но, обычно, не 2-3 потока). Можно, кто ж спорит, но QtConcurrent::run() по умолчанию будет запускать QThread::idealThreadCount() потоков, что для одноядерной машины равно 1.Название: Re: многопоточность Отправлено: StatuS74 от Июля 07, 2011, 11:34 неожиданно случилась проблема =)
Код: QFuture <void> future1a= QtConcurrent::run(tempiratura_datchika,tn1,name_file1,nms,ftHandle1,serial1,tk1); no matching function for call to run ... если этот агумент убрать то всё работает. Название: Re: многопоточность Отправлено: LisandreL от Июля 07, 2011, 11:42 А в tempiratura_datchika вы её добавили? С тем же типом?
Или только в run? Название: Re: многопоточность Отправлено: StatuS74 от Июля 07, 2011, 11:44 конечно добавил...
Название: Re: многопоточность Отправлено: LisandreL от Июля 07, 2011, 11:47 По идее не должно быть ошибки. Покажите объявление tempiratura_datchika и tk1.
Название: Re: многопоточность Отправлено: StatuS74 от Июля 07, 2011, 11:49 void tempiratura_datchika ( double tna,QString file_name,QString nms,FT_HANDLE ftHandle1,QString serial,double Tk)
Название: Re: многопоточность Отправлено: StatuS74 от Июля 08, 2011, 05:51 ни кто подсказать не может ???
Название: Re: многопоточность Отправлено: StatuS74 от Июля 08, 2011, 06:33 а не может быть такое что эта функция run сама по себе не может держать больше 5 параметров у вызываемой функции ??? в асистенте про это ни сказано
Название: Re: многопоточность Отправлено: StatuS74 от Июля 08, 2011, 07:21 да действительно больше 5 не держит эта функция..
в асистенте нашол вот Код: void someFunction(int arg1, double arg2); Название: Re: многопоточность Отправлено: StatuS74 от Июля 08, 2011, 07:55 Код: QFuture <void> future1a= QtConcurrent::run(bind(tempiratura_datchika,tn1,name_file1,nms,ftHandle1,serial1,tk1)); пробую запустить так ругается на параметр сокет Название: Re: многопоточность Отправлено: LisandreL от Июля 08, 2011, 08:04 а не может быть такое что эта функция run сама по себе не может держать больше 5 параметров у вызываемой функции ??? в асистенте про это ни сказано :(Значит придётся паковать параметры в запись. Название: Re: многопоточность Отправлено: StatuS74 от Июля 08, 2011, 08:10 нашол вот в асистенте
QtConcurrent::run(boost::bind вроде как больше 5 параметров держит но как записать не совсем понятно Название: Re: многопоточность Отправлено: kambala от Июля 09, 2011, 15:41 нужно ставить библиотеку boost
|