Russian Qt Forum
Ноябрь 25, 2024, 02:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Новичкам про потоки  (Прочитано 42840 раз)
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« : Январь 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 Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Январь 11, 2017, 13:31 »

Как насчёт OpenMP директив?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Январь 11, 2017, 13:35 »

Как насчёт OpenMP директив?
Подробнее? Это заготовка, которую будем дополнять.
« Последнее редактирование: Январь 11, 2017, 14:03 от Пантер » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #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 Offline

Сообщений: 2095



Просмотр профиля
« Ответ #4 : Январь 11, 2017, 13:57 »

Я бы ещё создал тему "Вредные советы по программированию для новичков"  в какой-нибудь сатирической форме Улыбающийся Типа:
1) Запомните раз и навсегда - букварь - Зло! Зло с большой буквы! Не засоряйте свой чердак всяким хламом, чердак не резиновый: Помните, Букварь убивает творческое мышление!
2) Никогда, никогда не используйте готовые решения - всегда изобретайте своё. Скорее всего Ваше решение получится более удобным, правильным и расширяемым и главное, понятным, для всех! К тому же это развивает творческое мышление, а Вы Творец (все умрут, а я грейпфрут!).
3) ...

Ну и т.д.  Подмигивающий
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Январь 11, 2017, 14:02 »

m_ax, ты дерзай, а я прикремплю. Смеющийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Январь 11, 2017, 14:13 »

А что это за асинхронная работа с файлом? Я привык открыть файл через поток и прочитать его. О чём речь?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Январь 11, 2017, 14:37 »

А что это за асинхронная работа с файлом? Я привык открыть файл через поток и прочитать его. О чём речь?
Сорри, убрал про файлы. Имелось ввиду все, что наследуется от QIODevice.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #8 : Январь 11, 2017, 16:02 »

Цитировать
Сорри, убрал про файлы. Имелось ввиду все, что наследуется от QIODevice.

Гы, а файлы (QFile) то наследуются. Но QFile ну никак не асинхронное. Улыбающийся
А как же использовать QSql без потоков то? И вроде нету sleep и waitFor... но но все-равно тормозит.  Улыбающийся
« Последнее редактирование: Январь 11, 2017, 16:04 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Январь 11, 2017, 16:03 »

Цитировать
Сорри, убрал про файлы. Имелось ввиду все, что наследуется от QIODevice.

Гы, а файлы то наследуются. Но QFile ну никак не асинхронное. Улыбающийся
Как сказать, waitForBytesWritten у него как реализовано?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #10 : Январь 11, 2017, 16:05 »

Там оно (QFile) и без waitFor... тормозит. 
Записан

ArchLinux x86_64 / Win10 64 bit
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Январь 11, 2017, 16:05 »

1) Запомните раз и навсегда - букварь - Зло! Зло с большой буквы! Не засоряйте свой чердак всяким хламом, чердак не резиновый: Помните, Букварь убивает творческое мышление!
В прошлый раз Вы говорили лучше: "букварь - пойло для лохов"  Улыбающийся

2) Никогда, никогда не используйте готовые решения - всегда изобретайте своё. Скорее всего Ваше решение получится более удобным, правильным и расширяемым и главное, понятным, для всех! К тому же это развивает творческое мышление, а Вы Творец (все умрут, а я грейпфрут!).
Тоже очень полезный совет (пусть и доведенный до абсурда). Кстати до слова "расширяемость" новичку (или проекту его) еще надо дорасти

По поводу "многопоточности"- есть очень разные уровни ее понимания. Я бы добавил примерно такие советы

- использование относительно низкоуровневых примитивов синхронизации (напр QWaitCondition, QSemaphore) не запрещено, но содержит немало ловушек/подвохов на, казалось бы, пустом месте. Напр wakeAll/One оказывается далеко не всегда "кого-то будит".  Поэтому всегда сначала задумайтесь о более простом способе: run нитки и общение с ней с помощью слот/сигнал.

- первое что попадает под удар в параллельном коде - глобальные переменные. Вообще просто так нельзя читать/писать переменные используемые 2-мя и более нитками (хотя есть исключения).

- засисяться мутексами конечно надо, но не суйте их везде. Так Вы засорите код и быстро устанете. Заодно поинтересуйтесь что такое атомарный (unfair) мутекс

- не воспринимайте рекомендацию "вынести в поток" как лучший/единственный способ, нередко это не так. Вообще не связывайтесь с "разпоточиванием" просто так

Welcome to MP nightmare!
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #12 : Январь 11, 2017, 16:08 »

Полезные советы:
забыли добавить - аминь!
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #13 : Январь 11, 2017, 16:09 »

Цитировать
Лучше наследоваться от QObject и делать moveToThread
Цитировать
Поэтому всегда сначала задумайтесь о более простом способе: run нитки и общение с ней с помощью слот/сигнал.

Не лучше, т.к. оно (использование сигнал/слотов с moveToThread) "забивает" очередь сообщений (когда "приемник , находящийся в потоке" обрабатывает данные медленнее чем они ему передаются), в отличии от "прямого наследования от QThread".

Везде есть свои нюансы.
« Последнее редактирование: Январь 11, 2017, 16:12 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Январь 11, 2017, 16:13 »

Напр wakeAll/One оказывается далеко не всегда "кого-то будит".
Да ладно. Всегда будит.
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.159 секунд. Запросов: 22.