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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: многопоточность, func arg  (Прочитано 8723 раз)
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #15 : Октябрь 08, 2020, 15:47 »

"Пространство имен QtConcurrent предоставляет высокоуровневые API, которые делают возможным написание многопоточных программ без использования низкоуровневых потоковых примитивов, таких как мьютексы, блокировки чтение-запись, условия ожидания или семафоры." -это значит, что я не могу использовать мьютексты и все остальное для синхронизации?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #16 : Октябрь 08, 2020, 17:08 »

можете, но это убивает основную идею QtConcurrent - не использовать их=) QtConcurrent использует разделение по данным - если к одной ячейке массива имеет доступ один поток, ничего синхронизировать не надо. если у вас возникает шаред стейт, то неясно, зачем нужен конкаррент
Записан
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #17 : Октябрь 08, 2020, 19:09 »

можете, но это убивает основную идею QtConcurrent - не использовать их=) QtConcurrent использует разделение по данным - если к одной ячейке массива имеет доступ один поток, ничего синхронизировать не надо. если у вас возникает шаред стейт, то неясно, зачем нужен конкаррент
в моем случае я просто хотел с самого начала запускать в разных потоках одну и ту же функцию одного и того же объекта с разными входными данными.Тогда возвращусь к нему, как это через обычный QThread реализовать?
Если же я делаю moveToThread то я работаю с объектом в потоке, куда поместил объект, а если я хочу запустить одну и туже функцию в разных ппотоках, только через конкурент?
« Последнее редактирование: Октябрь 08, 2020, 20:14 от opera » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Октябрь 09, 2020, 07:31 »

можете, но это убивает основную идею QtConcurrent - не использовать их=) QtConcurrent использует разделение по данным
Ну не то чтоб совсем уж "убивает"  Улыбающийся, но "противоречит" или "не согласуется". И не "использует", а "предполагает" (разделение по данным)

в моем случае я просто хотел с самого начала запускать в разных потоках одну и ту же функцию одного и того же объекта с разными входными данными.Тогда возвращусь к нему, как это через обычный QThread реализовать?
Если же я делаю moveToThread то я работаю с объектом в потоке, куда поместил объект, а если я хочу запустить одну и туже функцию в разных ппотоках, только через конкурент?
"Поток" - это просто "исполнитель", ему совершенно все равно какую ф-цию какого объекта исполнять. Разница лишь в том откуда (или как) берется эта нитка-исполнитель: автоматом из пула (QtConcurrent) или создается руками (QThread)

И в любом случае если "одного и того же объекта" то Ваша забота чтобы 2 или более потоков не писали одновременно одни и те же данные
Записан
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #19 : Октябрь 09, 2020, 09:59 »

Поток" - это просто "исполнитель", ему совершенно все равно какую ф-цию какого объекта исполнять. Разница лишь в том откуда (или как) берется эта нитка-исполнитель: автоматом из пула (QtConcurrent) или создается руками (QThread)
И в любом случае если "одного и того же объекта" то Ваша забота чтобы 2 или более потоков не писали одновременно одни и те же данные
да, но я же не могу поместить в два разных потока один и тот же объект , мне как минимум его плодить(копировать) прийдется или я что-то не понимаю, поэтому и спрашиваю, как запустить функцию func(int i) объекта obj в разных потоках, но от одного объекта?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #20 : Октябрь 09, 2020, 12:05 »

да, но я же не могу поместить в два разных потока один и тот же объект , мне как минимум его плодить(копировать) прийдется или я что-то не понимаю, поэтому и спрашиваю, как запустить функцию func(int i) объекта obj в разных потоках, но от одного объекта?

Можете через run, с синхронизацией.
run это достаточно низкоуровневый метод, просто удобная обертка над QRunnable - какие задачи ставить, вам решать.
Я имел ввиду map/reduce - map тем и хорош что не требует синхронизаций, а значит позволяет параллельно обрабатывать огромные массивы данных.
Но вообще в многопоточном программмировании лучше избегать shared state если он не константный - там где блокировка, там обычно узкое место. Поэтому зачастую скопировать выходит дешевле (как в терминах скорости разработки так и производительности)
Записан
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #21 : Октябрь 09, 2020, 13:00 »

Вы имеете в виду переопределения метода run?run-это же start()?
можно пример, кусочек хотя бы некомпилированный)?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #22 : Октябрь 09, 2020, 13:07 »

QtConcurrent::run
Записан
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #23 : Октябрь 09, 2020, 13:09 »

QtConcurrent::run
а , ну это то я понял, я думал через QThread скажите
Записан
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #24 : Октябрь 13, 2020, 15:12 »

еще вопрос по многопоточности, если я использую конкурент, как мне сделать, чтобы в этот момент gui работал в главном потоке, а конкуренты в других и не влияли на отображение окон при своих вычислениях, а то сейчас с конкурентом окно не в отдельном потоке?
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #25 : Октябрь 13, 2020, 16:03 »

GUI из отдельного потока вообще нельзя напрямую дергать.
Окна всегда должны быть в главном потоке, из него можно делать QtConcurrent::run методов, которые напрямую графику не дергают.
Записан
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #26 : Октябрь 13, 2020, 16:11 »

GUI из отдельного потока вообще нельзя напрямую дергать.
Окна всегда должны быть в главном потоке, из него можно делать QtConcurrent::run методов, которые напрямую графику не дергают.

У меня вот так написано в main.cpp:
Код:
MainWindow* w = new MainWindow();
w->show();

simpleCalculateClass classObj;

std::vector <QFuture<QString>> listFuncs;
int count_thread = QThread::idealThreadCount()-1;
for(int i = 0; i < count_thread; i++)
    listFuncs.push_back(QtConcurrent::run(&classObj,&simpleCalculateClass::incrCalc, QString::number(i), 1111111111));

и окно не загружается, пока происходит calculate


UPDATE:
просто надо было waitForFinished убрать, понял
« Последнее редактирование: Октябрь 13, 2020, 17:08 от opera » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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