Russian Qt Forum
Ноябрь 22, 2024, 16:41
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Многопоточное программирование, процессы
>
Развить пример
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Развить пример (Прочитано 5569 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Развить пример
«
:
Июнь 07, 2016, 10:43 »
Добрый день
В соседней теме рассматривается этот пример
http://doc.qt.io/qt-5/qthread.html#details
, в котором предлагается цивильный способ "выноса операции в поток". Впрочем и простецкое наследование от QThread не осуждается, идет следующим примером. Обсуждение получилось довольно "академическое", типа "а чего это сигнал public, это же небезопасно!". Тут хотелось бы поговорить о другом
Да, так мы умеем "выносить", но что если "выносимых" две или больше или вообще они идут мутным потоком? Их можно свалить одному контроллеру, но так (в среднем) задействуется лишь одно ядро, операции будут ждать. Плодить контроллеры явно не хочется, а QtConcurrent не в масть. Что бы Вы предложили?
Спасибо
Записан
_OLEGator_
Гость
Re: Развить пример
«
Ответ #1 :
Июнь 07, 2016, 11:03 »
Использовать QThreadPool.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Развить пример
«
Ответ #2 :
Июнь 08, 2016, 14:45 »
Допустим, у нас задачи сыпятся в общую очередь. Тогда.
I. Как раз таки конкурент в масть. Контроллер обрабатывает новую задачу, создаёт футуру, вешает на неё вотчера. Вотчеров можно создать заранее (по кол-ву тредов) и сделать очередь футур, к-ую разгребают свободные вотчеры. Это если не хочется аллоцировать вотчеров.
II. Несколько тредов, к-ые крутят эвентлуп, в каждом живёт воркер. Все воркеры подсоединены к сигналу контроллера естьРабота(). При появлении задачи мы просто кладем ее в очередь, эмитим сигнал. Первый свободный вотчер "успеет" схватить задачу, остальные сработают вхолостую. По сути тоже, что I, только вместо спящих на QWaitCondition тредах в пуле мы крутим всегда эвентлупы (и спим на select'е).
Записан
rudireg
Гость
Re: Развить пример
«
Ответ #3 :
Ноябрь 02, 2016, 20:46 »
Цитата: Igors от Июнь 07, 2016, 10:43
Добрый день
В соседней теме рассматривается этот пример
http://doc.qt.io/qt-5/qthread.html#details
, в котором предлагается цивильный способ "выноса операции в поток". Впрочем и простецкое наследование от QThread не осуждается, идет следующим примером. Обсуждение получилось довольно "академическое", типа "а чего это сигнал public, это же небезопасно!". Тут хотелось бы поговорить о другом
Да, так мы умеем "выносить", но что если "выносимых" две или больше или вообще они идут мутным потоком? Их можно свалить одному контроллеру, но так (в среднем) задействуется лишь одно ядро, операции будут ждать. Плодить контроллеры явно не хочется, а QtConcurrent не в масть. Что бы Вы предложили?
Спасибо
А почему
Цитировать
задействуется лишь одно ядро
- если мы сделаем
moveToThread
? Разве слоты перенесенного QObject в подобном случае не должны выполнятся в другой нитке?
«
Последнее редактирование: Ноябрь 02, 2016, 20:48 от rudireg
»
Записан
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: Развить пример
«
Ответ #4 :
Ноябрь 03, 2016, 06:21 »
rudireg, отдельный поток не гарантирует отдельное ядро процессора
Записан
Юра.
rudireg
Гость
Re: Развить пример
«
Ответ #5 :
Ноябрь 03, 2016, 08:52 »
Цитата: lit-uriy от Ноябрь 03, 2016, 06:21
rudireg, отдельный поток не гарантирует отдельное ядро процессора
А можно ли средствами QT назначать нитки разным ядрам?
Я всегда думал что ОС берет на себя функции распределения.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Развить пример
«
Ответ #6 :
Ноябрь 03, 2016, 09:15 »
Цитата: rudireg от Ноябрь 03, 2016, 08:52
А можно ли средствами QT назначать нитки разным ядрам?
Нет, такая фишка есть у интела и то не для всех платформ.
Цитата: rudireg от Ноябрь 03, 2016, 08:52
Я всегда думал что ОС берет на себя функции распределения.
Да, берет, Напр 2 нитки считают - ОС автоматом будет им выделять кванты времени на тех ядрах что сочтет нужным. Если в это время активны еще приложения - им тоже выделится время. Но "кормить" нитки (т.е. давать им задачи и пускать на выполнение) - забота не ОС, а программиста
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...