Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Многопоточность 
:(
    Опции темы
wowka19
  Дата 12.6.2014, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Есть возможность и острая нужда повысить быстродействие при помощи потоков.
Программой будут пользоваться на различных машинах: 2 ядра, 4 а может и 8. Отсюда вопрос: нужно ли как-то обыгрывать этот неизвестный фактор? Т.е. нужно ли во время выполнения узнавать сколько ядер на машине и от этого плясать (кол-во потоков == кол-ву логических ядер)? или не стоит париться и жестко зашить 8 потоков (или 16 про запас)? Не будет ли проблем или просадок когда потоков будет 8, а ядер - 2?

Это сообщение отредактировал(а) wowka19 - 12.6.2014, 02:03
PM MAIL   Вверх
borisbn
Дата 12.6.2014, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



> нужно ли во время выполнения узнавать сколько ядер на машине и от этого плясать (кол-во потоков == кол-ву логических ядер)?
Нужно. Обязательно. Тем более, что это делается просто - QThread::idealThreadCount()


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
wowka19
Дата 12.6.2014, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



а почему?
почему нельзя создать кучу потоков про запас? они же всеравно выполнятся.
PM MAIL   Вверх
borisbn
Дата 12.6.2014, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Переключение между потоками на одном ядре гораздо более затратная вещь, чем переключение между ядрами.
У меня как-то была программа, в которой крутилось 48 потоков (по количеству каналов обработки). "Кушала" она около 40 % процессора. Когда я перевёл её на 8 потоков (по кол-ву ядер) и в каждом последовательно (!!) обрабатывал по 6 каналов, она стала кушать около 30 %. Выигрыш в производительности - четверть. Там, правда, ещё была запись на винт (из всех потоков - в один каталог), и м.б. это тоже повлияло... хз. В общем, есть только одно средство проверить... и ты, я думаю, догадываешься какой  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
math64
Дата 12.6.2014, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Есть такая штука - QtConcurent. Сама определит оптимальное количество потоков и создаст их. Ей нужно будет давать  задания, а она сама распределит их по потокам.
PM   Вверх
wowka19
Дата 13.6.2014, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Не могу понять QThread. В голове каша.
Задача: фоном подгружать картинки в GUI с диска. Естественно нужен отдельный поток.
Но как это сделать хз - никогда раньше не писал многопоточный код. Примеры из доки вроде понятны, но приступаю к своей задаче и впадаю в ступор.
Буду признателен, если кто приведет кусок кода для подгрузки картинки (либо любого другого ресурса) фоном. Как потом производить передачу этого ресурса в основной поток, как сбросить работу фонового потока, если он уже не актуален и нужен другой ресурс...
PM MAIL   Вверх
math64
Дата 13.6.2014, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Нужный тебе пример включен в Qt - если, конечно, ты согласен использовать QtConcurent вместо простого QThread.
PM   Вверх
wowka19
Дата 14.6.2014, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



нет. хочу разобраться с QThread, но нифига не получается.
Немного конкретизирую задачу:
Есть QGraphicsPixmapItem в главном потоке. Необходимо в другом потоке подгрузить создать QPixmap и как-то его всунуть в QGraphicsPixmapItem::setPixmap(const QPixmap&). При этом QPixmap, хранящийся в QGraphicsPixmapItem, очевидно считывается главным потоком, поэтому надо как-то заблокировать или не надо... Мне бы кусочек кода, реализующий это (не надо компилируемый).
PM MAIL   Вверх
borisbn
Дата 14.6.2014, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Тебе  нужно в наследнике потока создать сигнал типа
Код
signals:
    void pixmapReady( QPixmap p );

В главном потоке после создания потока обработки сделать connect
m_workThread = new WorkThread();
Код
connect( m_workThread
    , SIGNAL( pixmapReady( QPixmap ) )
    , m_graphicsPixmapItem
    , SLOT( setPixmap( const QPixmap & ) )
);

и дёргать сигнал в потоке обработки
Код
QPixmap p;
p.blablabla...
emit pixmapReady( p );



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
wowka19
Дата 16.6.2014, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



... при этом (продолжая предыдущий пост borisbn) не забыть переместить объект потока в контекст этого же потока - я наконец-то разобрался с QThread. Спасибо всем кто помогал!
Но я не наследую QThread, а создаю потомка QObject - загрузчика картинок и перемещаю его в контекст созданного потока QThread ( QObject::moveToThread(QThread*) ) - так имхо логичнее и понятнее ибо Qt'шные доки (где наследуется QThread и перегружается run()) только запутывают. Это я пишу для следующих вопрошающих (авось пригодится).


Остался один вопрос:
В итоге у меня два объекта из разных потоков общаются между собой через сигналы/слоты - здесь проблем никаких, но конечно же не обошлось без общих переменных, которые запрашиваются из обоих потоков. Их две и обе переменные имеют тип BOOL. Вопрос - надо ли их защищать от одновременного обращения? или запись и чтение BOOL - так скажем, "атомарные" операции, и не могут осуществляться одновременно даже если потоки выполняются на разных физических ядрах? Добавлю, что я их (переменные) не защищал, и у меня все работает без сбоев, хотя может мне просто повезло и при других условиях (компилятор, ОСь,..) все может рухнуть?..
PM MAIL   Вверх
wowka19
Дата 21.6.2014, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



up:
Цитата(wowka19 @  16.6.2014,  18:46 Найти цитируемый пост)
Остался один вопрос:
В итоге у меня два объекта из разных потоков общаются между собой через сигналы/слоты - здесь проблем никаких, но конечно же не обошлось без общих переменных, которые запрашиваются из обоих потоков. Их две и обе переменные имеют тип BOOL. Вопрос - надо ли их защищать от одновременного обращения? или запись и чтение BOOL - так скажем, "атомарные" операции, и не могут осуществляться одновременно даже если потоки выполняются на разных физических ядрах? Добавлю, что я их (переменные) не защищал, и у меня все работает без сбоев, хотя может мне просто повезло и при других условиях (компилятор, ОСь,..) все может рухнуть?.. 

... и нужно ли эти переменные объявлять как volatile?


Это сообщение отредактировал(а) wowka19 - 21.6.2014, 16:28
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0820 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.