Russian Qt Forum
Ноябрь 22, 2024, 03:56
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Новичкам про потоки
Страниц: [
1
]
2
3
4
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Новичкам про потоки (Прочитано 42777 раз)
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Новичкам про потоки
«
:
Январь 11, 2017, 13:28 »
Полезные советы:
Не используйте потоки
Если программа виснет, не используйте потоки, пока не попробуете другие методы
Если в вашей программе есть аналоги *sleep или всякие блокирующие waitFor*, у вас скорее всего неправильная архитектура
Работайте сокетами ассинхронно через сигналы/слоты (readyRead)
Если у вас есть есть "тяжелые" вычисления, посмотрите в сторону QtConcurrent
Не наследуйтесь от QThread. Лучше наследоваться от QObject и делать moveToThread, в этом случае вы можете один класс использовать как в отдельном потоке, так и в основном без изменения кода. Плюс, можете использовать пулл потоков
Попробуйте использовать QRunnable
«
Последнее редактирование: Январь 11, 2017, 14:37 от Пантер
»
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Новичкам про потоки
«
Ответ #1 :
Январь 11, 2017, 13:31 »
Как насчёт OpenMP директив?
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Новичкам про потоки
«
Ответ #2 :
Январь 11, 2017, 13:35 »
Цитата: __Heaven__ от Январь 11, 2017, 13:31
Как насчёт OpenMP директив?
Подробнее? Это заготовка, которую будем дополнять.
«
Последнее редактирование: Январь 11, 2017, 14:03 от Пантер
»
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Новичкам про потоки
«
Ответ #3 :
Январь 11, 2017, 13:46 »
Если имеется некий долгий цикл пробега по вектору вида
Код
C++ (Qt)
for
(
int
i
=
0
;
i
<
n
;
++
i
)
То можно перед ним написать
Код
C++ (Qt)
#pragma omp parallel for
тем самым получим расщепление цикла на несколько потоков. Вроде, на максимально возможное, по умолчанию. Правда, тут я столкнулся с проблемой вложенности таких вызовов, то есть когда через параллельный for вызывается функция, которая тоже выполняет параллельный for. До конца пока не разобрался, что там творится.
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Новичкам про потоки
«
Ответ #4 :
Январь 11, 2017, 13:57 »
Я бы ещё создал тему "Вредные советы по программированию для новичков" в какой-нибудь сатирической форме
Типа:
1) Запомните раз и навсегда - букварь - Зло! Зло с большой буквы! Не засоряйте свой чердак всяким хламом, чердак не резиновый: Помните, Букварь убивает творческое мышление!
2) Никогда, никогда не используйте готовые решения - всегда изобретайте своё. Скорее всего Ваше решение получится более удобным, правильным и расширяемым и главное, понятным, для всех! К тому же это развивает творческое мышление, а Вы Творец (все умрут, а я грейпфрут!).
3) ...
Ну и т.д.
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Новичкам про потоки
«
Ответ #5 :
Январь 11, 2017, 14:02 »
m_ax, ты дерзай, а я прикремплю.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Новичкам про потоки
«
Ответ #6 :
Январь 11, 2017, 14:13 »
А что это за асинхронная работа с файлом? Я привык открыть файл через поток и прочитать его. О чём речь?
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Новичкам про потоки
«
Ответ #7 :
Январь 11, 2017, 14:37 »
Цитата: __Heaven__ от Январь 11, 2017, 14:13
А что это за асинхронная работа с файлом? Я привык открыть файл через поток и прочитать его. О чём речь?
Сорри, убрал про файлы. Имелось ввиду все, что наследуется от QIODevice.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Новичкам про потоки
«
Ответ #8 :
Январь 11, 2017, 16:02 »
Цитировать
Сорри, убрал про файлы. Имелось ввиду все, что наследуется от QIODevice.
Гы, а файлы (QFile) то наследуются. Но QFile ну никак не асинхронное.
А как же использовать QSql без потоков то? И вроде нету sleep и waitFor... но но все-равно тормозит.
«
Последнее редактирование: Январь 11, 2017, 16:04 от kuzulis
»
Записан
ArchLinux x86_64 / Win10 64 bit
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Новичкам про потоки
«
Ответ #9 :
Январь 11, 2017, 16:03 »
Цитата: kuzulis от Январь 11, 2017, 16:02
Цитировать
Сорри, убрал про файлы. Имелось ввиду все, что наследуется от QIODevice.
Гы, а файлы то наследуются. Но QFile ну никак не асинхронное.
Как сказать, waitForBytesWritten у него как реализовано?
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Новичкам про потоки
«
Ответ #10 :
Январь 11, 2017, 16:05 »
Там оно (QFile) и без waitFor... тормозит.
Записан
ArchLinux x86_64 / Win10 64 bit
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Новичкам про потоки
«
Ответ #11 :
Январь 11, 2017, 16:05 »
Цитата: m_ax от Январь 11, 2017, 13:57
1) Запомните раз и навсегда - букварь - Зло! Зло с большой буквы! Не засоряйте свой чердак всяким хламом, чердак не резиновый: Помните, Букварь убивает творческое мышление!
В прошлый раз Вы говорили лучше: "букварь - пойло для лохов"
Цитата: m_ax от Январь 11, 2017, 13:57
2) Никогда, никогда не используйте готовые решения - всегда изобретайте своё. Скорее всего Ваше решение получится более удобным, правильным и расширяемым и главное, понятным, для всех! К тому же это развивает творческое мышление, а Вы Творец (все умрут, а я грейпфрут!).
Тоже очень полезный совет (пусть и доведенный до абсурда). Кстати до слова "расширяемость" новичку (или проекту его) еще надо дорасти
По поводу "многопоточности"- есть очень разные уровни ее понимания. Я бы добавил примерно такие советы
- использование относительно низкоуровневых примитивов синхронизации (напр QWaitCondition, QSemaphore) не запрещено, но содержит немало ловушек/подвохов на, казалось бы, пустом месте. Напр wakeAll/One оказывается далеко не всегда "кого-то будит". Поэтому всегда сначала задумайтесь о более простом способе: run нитки и общение с ней с помощью слот/сигнал.
- первое что попадает под удар в параллельном коде - глобальные переменные. Вообще просто так нельзя читать/писать переменные используемые 2-мя и более нитками (хотя есть исключения).
- засисяться мутексами конечно надо, но не суйте их везде. Так Вы засорите код и быстро устанете. Заодно поинтересуйтесь что такое атомарный (unfair) мутекс
- не воспринимайте рекомендацию "вынести в поток" как лучший/единственный способ, нередко это не так. Вообще не связывайтесь с "разпоточиванием" просто так
Welcome to MP nightmare!
Записан
sergek
Гипер активный житель
Offline
Сообщений: 872
Мы должны приносить пользу людям.
Re: Новичкам про потоки
«
Ответ #12 :
Январь 11, 2017, 16:08 »
Цитата: Пантер от Январь 11, 2017, 13:28
Полезные советы:
забыли добавить - аминь!
Записан
Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Новичкам про потоки
«
Ответ #13 :
Январь 11, 2017, 16:09 »
Цитировать
Лучше наследоваться от QObject и делать moveToThread
Цитировать
Поэтому всегда сначала задумайтесь о более простом способе: run нитки и общение с ней с помощью слот/сигнал.
Не лучше, т.к. оно (использование сигнал/слотов с moveToThread) "забивает" очередь сообщений (когда "приемник , находящийся в потоке" обрабатывает данные медленнее чем они ему передаются), в отличии от "прямого наследования от QThread".
Везде есть свои нюансы.
«
Последнее редактирование: Январь 11, 2017, 16:12 от kuzulis
»
Записан
ArchLinux x86_64 / Win10 64 bit
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Новичкам про потоки
«
Ответ #14 :
Январь 11, 2017, 16:13 »
Цитата: Igors от Январь 11, 2017, 16:05
Напр wakeAll/One оказывается далеко не всегда "кого-то будит".
Да ладно. Всегда будит.
Записан
Страниц: [
1
]
2
3
4
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...