Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: ksk- от Ноябрь 07, 2012, 21:09



Название: Общий вопрос о многопоточности.
Отправлено: ksk- от Ноябрь 07, 2012, 21:09
Всем привет. Мой вопрос имеет крайне малое отношение непосредственно к Qt, но всё же я решил задать его здесь. Допустим, я решил создать некий менеджер загрузок, который будет загружать большое кол-во файлов с сервера. Каждый файл планируется загружать в отдельном потоке, процесс загрузки каждого файла будет отображаться в отдельном ProgressBar'е. Вопрос: сколько разумнее всего завести для этого потоков, и почему? Ведь, я полагаю, будет очень глупо для загрузки 100 файлов создавать 100 потоков.


Название: Re: Общий вопрос о многопоточности.
Отправлено: Igors от Ноябрь 07, 2012, 21:33
Каждый файл планируется загружать в отдельном потоке, процесс загрузки каждого файла будет отображаться в отдельном ProgressBar'е. Вопрос: сколько разумнее всего завести для этого потоков, и почему? Ведь, я полагаю, будет очень глупо для загрузки 100 файлов создавать 100 потоков.
Ну это столь же глупо как делать 100 ProgressBar'ов :). Оптимальное число ниток давно известно: число ядер  (+ может быть) 1 (см idealThreadCount). Реализация

Код
C++ (Qt)
#pragma omp parallel for
for (size_t i = 0; i < files.size(); ++i)
LoadFile(files[i]);
 



Название: Re: Общий вопрос о многопоточности.
Отправлено: Bepec от Ноябрь 08, 2012, 06:57
Видимо парень имел в виду менеджер загрузок, подобно download master'у или торренту.

Хм. Интересно. Тогда вопрос по теме - как реализован download master или торрент? Более 50 файлов загружать одновременно - легко делают.


Название: Re: Общий вопрос о многопоточности.
Отправлено: kuzulis от Ноябрь 08, 2012, 10:31
А если посмотреть исходники примера торрент качалки из Qt?


Название: Re: Общий вопрос о многопоточности.
Отправлено: Bepec от Ноябрь 08, 2012, 10:49
Йо, а такая есть? *полез в пыльный каталог примеров Qt*

Спасибо за наводку.


Название: Re: Общий вопрос о многопоточности.
Отправлено: Igors от Ноябрь 08, 2012, 10:51
Код
C++ (Qt)
#pragma omp parallel for
for (size_t i = 0; i < files.size(); ++i)
LoadFile(files[i]);
 
Тут я немного промазал - так будет скачиваться столько файлов сколько ниток. Если надо 50-100 (N). тогда так
Код
C++ (Qt)
#pragma omp parallel for
for (size_t i = 0; i < jobs.size(); ++i)
LoadFile(jobs[i]);
 
Смысл впрочем тот же - заряжается контейнер задач на который натравливается бригада ниток. Структура элемента очевидна, должен знать откуда качать, куда писать и.т.п. Конечно вместо omp можно использовать concurrent (кому что нравится)

А если посмотреть исходники примера торрент качалки из Qt?
Ох уж эти готовые примеры  :)


Название: Re: Общий вопрос о многопоточности.
Отправлено: ssoft от Ноябрь 09, 2012, 08:40
Очень легко можно организовать параллельную закачку файлов с помощью QtConcurent.
Рекомендую ознакомится.