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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QtConcurrent vs QThread  (Прочитано 14934 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Май 26, 2010, 21:27 »

Прошу объяснения так сказать на пальцах, в чем разница Непонимающий

Плюсы, минусы, я пока особой разницы не вижу, ну только кроме разных вызовов и использования.
Записан
Kolobok
Гость
« Ответ #1 : Май 26, 2010, 22:07 »

QtConcurrent
Скорость написания кода выше. Меньшее количество классов/файлов.

QThread
Большая гибкость.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Май 26, 2010, 22:23 »

Ну это я тоже заметил, но думал может есть какие то существенные отличия, насколько я понимаю QtConcurrent подходит для небольших вещей, и насколько я понимаю с ним нереально использовать всю силу сигнало\слотовой модели.
Записан
Amigo_sa
Гость
« Ответ #3 : Май 27, 2010, 17:23 »

Ассистант утверждает, что Concurrent - для упрощения работы и унификации.
Цитировать
The QtConcurrent namespace provides high-level APIs that make it possible to write multi-threaded programs without using low-level threading primitives such as mutexes, read-write locks, wait conditions, or semaphores. Programs written with QtConcurrent automatically adjust the number of threads used according to the number of processor cores available. This means that applications written today will continue to scale when deployed on multi-core systems in the future.
Записан
SASA
Гость
« Ответ #4 : Май 29, 2010, 12:50 »

У QtConcurrent есть механизм паралельных вычислений.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Май 29, 2010, 15:01 »

В моём понимании QtConcurrent нужен для однообразной обработки над контейнерами данных, когда эта обработка имеет непринципиальное для всей программы значение. В QtConcurrent нет возможности регулировать приоритет выполнения потока. И, как я заметил, при наличии большой работы над каждым элементом контейнера. Приложение начинает жутко тормозить. В таких случаях лучше использовать QThread и задавать пониженный приоритет
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Май 29, 2010, 17:45 »

В моём понимании QtConcurrent нужен для однообразной обработки над контейнерами данных, когда эта обработка имеет непринципиальное для всей программы значение. В QtConcurrent нет возможности регулировать приоритет выполнения потока. И, как я заметил, при наличии большой работы над каждым элементом контейнера. Приложение начинает жутко тормозить. В таких случаях лучше использовать QThread и задавать пониженный приоритет
Также скорость QtConcurrent заметно падает если одни из задач массива требуют значительно больше времени чем другие. Это еще называется "гранулярностью".
Записан
fuCtor
Гость
« Ответ #7 : Май 30, 2010, 09:15 »

В моём понимании QtConcurrent нужен для однообразной обработки над контейнерами данных, когда эта обработка имеет непринципиальное для всей программы значение. В QtConcurrent нет возможности регулировать приоритет выполнения потока. И, как я заметил, при наличии большой работы над каждым элементом контейнера. Приложение начинает жутко тормозить. В таких случаях лучше использовать QThread и задавать пониженный приоритет
Не обязательно над контейнерами. Тот же run, удобен когда необходимо запустить некий участок кода в отдельный поток (в фон), чтобы  не блокировать выполенение основного потока, НО при этом использование QThread было бы избыточным. Например процесс печати, заводить специализированный поток не вижу смысла, т.к. задача может быть не профильная, а использовать поток из пула вполне.
Записан
SABROG
Гость
« Ответ #8 : Май 30, 2010, 10:32 »

и насколько я понимаю с ним нереально использовать всю силу сигнало\слотовой модели.
Достаточно унаследоваться от QObject'a и передать адрес на метод твоего класса вместо адреса обычной Си функции. Я именно так реализовал работу сигналов и слотов в своем потоке, который запускал через QtConcurrent::run().

В QtConcurrent нет возможности регулировать приоритет выполнения потока. И, как я заметил, при наличии большой работы над каждым элементом контейнера. Приложение начинает жутко тормозить. В таких случаях лучше использовать QThread и задавать пониженный приоритет

QThread::currentThread() статический метод, который используется в нескольких Qtшных примерах для демонстрации возможностей QtConcurrent, поэтому такое должно работать:
Код
C++ (Qt)
QThread::currentThread()->setPriority(QThread::LowestPriority);
 

Судя по исходникам QThread - currentThread() динамически вызывает API GetCurrentThread() под Win32. И метод setPriority() вызывает SetThreadPriority(). По логике всё должно работать.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Май 30, 2010, 17:31 »

в том-то и дело, что currentThread, а это основной поток, его как раз и не надо трогать
Записан

Юра.
Kolobok
Гость
« Ответ #10 : Май 30, 2010, 17:48 »

в том-то и дело, что currentThread, а это основной поток, его как раз и не надо трогать

Нет, это не так. QtConcurrent запускает метод в отдельном потоке и этому потоку изменяется приоритет. Делал я так. Выглядит не очень красиво, но работает. Непонятно, почему тролли отказываются приоритет в QtConcurrent встроить.
Записан
fuCtor
Гость
« Ответ #11 : Май 30, 2010, 17:54 »

в том-то и дело, что currentThread, а это основной поток, его как раз и не надо трогать

Нет, это не так. QtConcurrent запускает метод в отдельном потоке и этому потоку изменяется приоритет. Делал я так. Выглядит не очень красиво, но работает. Непонятно, почему тролли отказываются приоритет в QtConcurrent встроить.

Потомучто потоки для выполнения берутся из пула. Следовательно этот же поток потом может достаться другой задаче, либо если будет идти выполнение mapreduce|filter то одни элименты будут обрабатываться с иным приоритетом, который когда то по необходимости выставил программист. Поэтому при таком финте нужно не забыть вернуть приоритет по окончании выполнения.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #12 : Май 30, 2010, 17:58 »

>Нет, это не так.
Что значит не так?
Вот код:
Код
C++ (Qt)
//...
QThread::currentThread()->setPriority(QThread::LowestPriority);
//...
 
текущий поток, в котором приведён этот код, будет подвергнут изменению приоритета
Записан

Юра.
Kolobok
Гость
« Ответ #13 : Май 30, 2010, 18:51 »

Да, но это не обязательно основной поток. QtConcurrent выполняет этот код в контексте другого потока и этот ( другой ) поток изменит приоритет.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #14 : Май 30, 2010, 19:00 »

>QtConcurrent выполняет этот код
он вообще к этому коду отношения не имеет.

Но теперь я понял что имел в виду SABROG. Он имел в виду - воткнуть эту строку в функцию, которая передаётся в QtConcurrent.
Записан

Юра.
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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