Многопоточность в QT с использованием QtConcurrent

Я занимаюсь разработкой приложения на Qt, которое в какой-то момент обрабатывает кучу видео.
Он отлично работает, но на фазе процесса у него было только 40-60% загрузки процессора, поэтому я попытался сделать его многопоточным.

Я использовал QtConcurrent, потому что его «высокая степень сложности» вместо более традиционного управления потоками, мой код просто:

for(int i = 0; i < totalVideos; i++)
{
QFuture<ResultClass *> futureToken = QtConcurrent::run(this, process, listOfVideos.takeFirst());
QFutureWatcher<ResultClass *>* fw = new QFutureWatcher<ResultClass *>();
connect(fw, SIGNAL(finished()), this, SLOT(manageResult));
fw->setFuture(futureToken);
}

ааа, и он работает, 100% использование процессора и его примерно на 25-30% быстрее. Но он порождает около 65 новых потоков (независимо от того, обрабатывает ли 25 или 250 видео), и большинство из этих потоков не исчезают после фазы процесса.

Мой вопрос: правильный ли это подход? Это слишком сырое? Должен ли я контролировать «вручную» создание потока? Заботится ли обо всем модуль QtConcurrent, поэтому мне не нужно заботиться об управлении потоками? 85 потоков слишком много? Должен ли я попытаться убить некоторых из них после фазы процесса?

Каждое наблюдение было сделано, просто глядя на монитор активности.

Заранее спасибо.

5

Решение

Будущее QtConcurrent кажется неопределенным, если вы читаете эта тема.

Наличие большего количества потоков для обработки ядер несколько избыточно. Если у вас работает одно ядро ​​и два потока, процессор тратит время на переключение между обработкой двух потоков, но у пользователя появляется вид одновременной обработки.

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

Как только у вас будет больше ядер, чем потоков, вы вернетесь к первоначальному методу ядер, перепрыгивающему вверх и назад между потоками, которые требуется обработать.

Использовать QThread на самом деле очень просто, так как QThread — это не поток, а контроллер потока. Вы можете прочитать о том, как ‘действительно действительно используйте QThreads’ здесь.

Как описано, вы создаете объекты, унаследованные от QObject, и перемещаете их в QThread. Что редко упоминается, так это то, что при необходимости вы можете переместить несколько объектов в новый QThread.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]