Russian Qt Forum

Qt => Общие вопросы => Тема начата: ecspertiza от Май 26, 2010, 21:27



Название: QtConcurrent vs QThread
Отправлено: ecspertiza от Май 26, 2010, 21:27
Прошу объяснения так сказать на пальцах, в чем разница ???

Плюсы, минусы, я пока особой разницы не вижу, ну только кроме разных вызовов и использования.


Название: Re: QtConcurrent vs QThread
Отправлено: Kolobok от Май 26, 2010, 22:07
QtConcurrent
Скорость написания кода выше. Меньшее количество классов/файлов.

QThread
Большая гибкость.


Название: Re: QtConcurrent vs QThread
Отправлено: ecspertiza от Май 26, 2010, 22:23
Ну это я тоже заметил, но думал может есть какие то существенные отличия, насколько я понимаю QtConcurrent подходит для небольших вещей, и насколько я понимаю с ним нереально использовать всю силу сигнало\слотовой модели.


Название: Re: QtConcurrent vs QThread
Отправлено: Amigo_sa от Май 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.


Название: Re: QtConcurrent vs QThread
Отправлено: SASA от Май 29, 2010, 12:50
У QtConcurrent есть механизм паралельных вычислений.


Название: Re: QtConcurrent vs QThread
Отправлено: lit-uriy от Май 29, 2010, 15:01
В моём понимании QtConcurrent нужен для однообразной обработки над контейнерами данных, когда эта обработка имеет непринципиальное для всей программы значение. В QtConcurrent нет возможности регулировать приоритет выполнения потока. И, как я заметил, при наличии большой работы над каждым элементом контейнера. Приложение начинает жутко тормозить. В таких случаях лучше использовать QThread и задавать пониженный приоритет


Название: Re: QtConcurrent vs QThread
Отправлено: Igors от Май 29, 2010, 17:45
В моём понимании QtConcurrent нужен для однообразной обработки над контейнерами данных, когда эта обработка имеет непринципиальное для всей программы значение. В QtConcurrent нет возможности регулировать приоритет выполнения потока. И, как я заметил, при наличии большой работы над каждым элементом контейнера. Приложение начинает жутко тормозить. В таких случаях лучше использовать QThread и задавать пониженный приоритет
Также скорость QtConcurrent заметно падает если одни из задач массива требуют значительно больше времени чем другие. Это еще называется "гранулярностью".


Название: Re: QtConcurrent vs QThread
Отправлено: fuCtor от Май 30, 2010, 09:15
В моём понимании QtConcurrent нужен для однообразной обработки над контейнерами данных, когда эта обработка имеет непринципиальное для всей программы значение. В QtConcurrent нет возможности регулировать приоритет выполнения потока. И, как я заметил, при наличии большой работы над каждым элементом контейнера. Приложение начинает жутко тормозить. В таких случаях лучше использовать QThread и задавать пониженный приоритет
Не обязательно над контейнерами. Тот же run, удобен когда необходимо запустить некий участок кода в отдельный поток (в фон), чтобы  не блокировать выполенение основного потока, НО при этом использование QThread было бы избыточным. Например процесс печати, заводить специализированный поток не вижу смысла, т.к. задача может быть не профильная, а использовать поток из пула вполне.


Название: Re: QtConcurrent vs QThread
Отправлено: SABROG от Май 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(). По логике всё должно работать.


Название: Re: QtConcurrent vs QThread
Отправлено: lit-uriy от Май 30, 2010, 17:31
в том-то и дело, что currentThread, а это основной поток, его как раз и не надо трогать


Название: Re: QtConcurrent vs QThread
Отправлено: Kolobok от Май 30, 2010, 17:48
в том-то и дело, что currentThread, а это основной поток, его как раз и не надо трогать

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


Название: Re: QtConcurrent vs QThread
Отправлено: fuCtor от Май 30, 2010, 17:54
в том-то и дело, что currentThread, а это основной поток, его как раз и не надо трогать

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

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


Название: Re: QtConcurrent vs QThread
Отправлено: lit-uriy от Май 30, 2010, 17:58
>Нет, это не так.
Что значит не так?
Вот код:
Код
C++ (Qt)
//...
QThread::currentThread()->setPriority(QThread::LowestPriority);
//...
 
текущий поток, в котором приведён этот код, будет подвергнут изменению приоритета


Название: Re: QtConcurrent vs QThread
Отправлено: Kolobok от Май 30, 2010, 18:51
Да, но это не обязательно основной поток. QtConcurrent выполняет этот код в контексте другого потока и этот ( другой ) поток изменит приоритет.


Название: Re: QtConcurrent vs QThread
Отправлено: lit-uriy от Май 30, 2010, 19:00
>QtConcurrent выполняет этот код
он вообще к этому коду отношения не имеет.

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


Название: Re: QtConcurrent vs QThread
Отправлено: Kolobok от Май 30, 2010, 19:02
Потомучто потоки для выполнения берутся из пула. Следовательно этот же поток потом может достаться другой задаче, либо если будет идти выполнение mapreduce|filter то одни элименты будут обрабатываться с иным приоритетом, который когда то по необходимости выставил программист. Поэтому при таком финте нужно не забыть вернуть приоритет по окончании выполнения.

Разве это проблема? Перед запуском выставить приоритет, после окончания восстановить. А сейчас получается, что нужно этот код выполнять столько раз, сколько элементов в контейнере.


Название: Re: QtConcurrent vs QThread
Отправлено: fuCtor от Май 30, 2010, 20:46
Было бы тогда логичней выставлять приоритет ВСЕМУ пулу потоков, а не одному из него. Но все равно как то криво выходит.

PS разве смена приоритета будет сильно просаживать? но тупо выглядеть будет факт.