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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Выбор техники организации многопотока в QT  (Прочитано 4748 раз)
rudireg
Гость
« : Февраль 20, 2013, 10:49 »

Добрый день.
Хочу написать многопоточное приложение на QT.
Например регистрация аккаунтов в социальной сети, в приложении я могу указать сколько потоков хочу использовать,
и каждый поток будет делать регистрацию аккаунта параллельно с другими потоками.

Думаю схема работы должна быть такой:
Поток UI (он же главный поток) -> Создает поток управление  = дав ему название Master
Далее поток Master должен создать дочерние потоки для выполнения задачи регистраций

Получается такая схема:
UI поток -> Master поток  -> Дочерние потоки от Master

Когда задача выполнилась, потоки должны высвободить память и завершиться.
---------------------------------------------------
Начал читать про методы построения многопоточных приложений в QT
выяснил что можно использовать такие средства как:
1)Использовать классы с унаследованием от QThread
2)Использовать QThreadPool в связке с классами унаследованными от QRunnable
3)Использование QCuncurrent

Подскажите чем отличаются эти методы, и в каких ситуациях нужно прибегать к тому или иному методу
И подскажите какой вариант выбрать мне для реализации сетевой задачи, описание которой выше

Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Февраль 20, 2013, 11:53 »

Лучше использовать "малопотоки" и очереди Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
rudireg
Гость
« Ответ #2 : Февраль 20, 2013, 12:18 »

Лучше использовать "малопотоки" и очереди Улыбающийся
А можно подробнее?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Февраль 20, 2013, 12:33 »

Ну QtConcurrent здесь ни при чем, он для низкоуровневых расчетов, напр по массиву. Наследование от QThread не ошибка, но необязательно, а иногда и порицается. В принципе любые нитки могут выполнять любые задачи если не связывать их наследованием.

Главное определиться с числом ниток - не будет ли оно (неконтролируемо) возрастать. Ну скажем если Вы уверены что "не более 50 ниток" - то проблем нет. Обычная техника для задач похожих на Вашу - запустить N ниток и пулять в них сигналами с QueuedConnection. Получив сигнал нитка выполняет задачу, отсылает сигнал с результатами и опять засыпает. Это не блещет скоростью но удобно и просто для реализации
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Февраль 20, 2013, 17:21 »

Ну QtConcurrent здесь ни при чем, он для низкоуровневых расчетов, напр по массиву.
Почему не причем? Это самый простой путь реализовать эту задачу.

2 rudireg: Вы перечислили средства от низкого уровня к высокому. Что выбрать решать вам, чем ниже уровень, тем с большими вещами придется разбираться. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Февраль 20, 2013, 18:53 »

Почему не причем? Это самый простой путь реализовать эту задачу.
Ну если "проще = лучше", то так
Код
C++ (Qt)
#pragma omp parallel for
for (int i = 0; i < account.size(); ++i)
account[i].register();
 
И вся любовь. Но это если регистрация - достаточно простое действие
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Февраль 20, 2013, 18:58 »

Но это если регистрация - достаточно простое действие
Почему простое - любое действие.

А вы приверженец такого? Улыбающийся
Это не блещет скоростью но удобно и просто для реализации
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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