![]() |
|
![]() ![]() ![]() |
|
wowka19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Есть возможность и острая нужда повысить быстродействие при помощи потоков.
Программой будут пользоваться на различных машинах: 2 ядра, 4 а может и 8. Отсюда вопрос: нужно ли как-то обыгрывать этот неизвестный фактор? Т.е. нужно ли во время выполнения узнавать сколько ядер на машине и от этого плясать (кол-во потоков == кол-ву логических ядер)? или не стоит париться и жестко зашить 8 потоков (или 16 про запас)? Не будет ли проблем или просадок когда потоков будет 8, а ядер - 2? Это сообщение отредактировал(а) wowka19 - 12.6.2014, 02:03 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
> нужно ли во время выполнения узнавать сколько ядер на машине и от этого плясать (кол-во потоков == кол-ву логических ядер)?
Нужно. Обязательно. Тем более, что это делается просто - QThread::idealThreadCount() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
wowka19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
а почему?
почему нельзя создать кучу потоков про запас? они же всеравно выполнятся. |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Переключение между потоками на одном ядре гораздо более затратная вещь, чем переключение между ядрами.
У меня как-то была программа, в которой крутилось 48 потоков (по количеству каналов обработки). "Кушала" она около 40 % процессора. Когда я перевёл её на 8 потоков (по кол-ву ядер) и в каждом последовательно (!!) обрабатывал по 6 каналов, она стала кушать около 30 %. Выигрыш в производительности - четверть. Там, правда, ещё была запись на винт (из всех потоков - в один каталог), и м.б. это тоже повлияло... хз. В общем, есть только одно средство проверить... и ты, я думаю, догадываешься какой ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Есть такая штука - QtConcurent. Сама определит оптимальное количество потоков и создаст их. Ей нужно будет давать задания, а она сама распределит их по потокам.
|
|||
|
||||
wowka19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Не могу понять QThread. В голове каша.
Задача: фоном подгружать картинки в GUI с диска. Естественно нужен отдельный поток. Но как это сделать хз - никогда раньше не писал многопоточный код. Примеры из доки вроде понятны, но приступаю к своей задаче и впадаю в ступор. Буду признателен, если кто приведет кусок кода для подгрузки картинки (либо любого другого ресурса) фоном. Как потом производить передачу этого ресурса в основной поток, как сбросить работу фонового потока, если он уже не актуален и нужен другой ресурс... |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Нужный тебе пример включен в Qt - если, конечно, ты согласен использовать QtConcurent вместо простого QThread.
|
|||
|
||||
wowka19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
нет. хочу разобраться с QThread, но нифига не получается.
Немного конкретизирую задачу: Есть QGraphicsPixmapItem в главном потоке. Необходимо в другом потоке подгрузить создать QPixmap и как-то его всунуть в QGraphicsPixmapItem::setPixmap(const QPixmap&). При этом QPixmap, хранящийся в QGraphicsPixmapItem, очевидно считывается главным потоком, поэтому надо как-то заблокировать или не надо... Мне бы кусочек кода, реализующий это (не надо компилируемый). |
|||
|
||||
borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Тебе нужно в наследнике потока создать сигнал типа
В главном потоке после создания потока обработки сделать connect m_workThread = new WorkThread();
и дёргать сигнал в потоке обработки
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
wowka19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
... при этом (продолжая предыдущий пост borisbn) не забыть переместить объект потока в контекст этого же потока - я наконец-то разобрался с QThread. Спасибо всем кто помогал!
Но я не наследую QThread, а создаю потомка QObject - загрузчика картинок и перемещаю его в контекст созданного потока QThread ( QObject::moveToThread(QThread*) ) - так имхо логичнее и понятнее ибо Qt'шные доки (где наследуется QThread и перегружается run()) только запутывают. Это я пишу для следующих вопрошающих (авось пригодится). Остался один вопрос: В итоге у меня два объекта из разных потоков общаются между собой через сигналы/слоты - здесь проблем никаких, но конечно же не обошлось без общих переменных, которые запрашиваются из обоих потоков. Их две и обе переменные имеют тип BOOL. Вопрос - надо ли их защищать от одновременного обращения? или запись и чтение BOOL - так скажем, "атомарные" операции, и не могут осуществляться одновременно даже если потоки выполняются на разных физических ядрах? Добавлю, что я их (переменные) не защищал, и у меня все работает без сбоев, хотя может мне просто повезло и при других условиях (компилятор, ОСь,..) все может рухнуть?.. |
|||
|
||||
wowka19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
up:
... и нужно ли эти переменные объявлять как volatile? Это сообщение отредактировал(а) wowka19 - 21.6.2014, 16:28 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |