Я занимаюсь разработкой приложения на 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 потоков слишком много? Должен ли я попытаться убить некоторых из них после фазы процесса?
Каждое наблюдение было сделано, просто глядя на монитор активности.
Заранее спасибо.
Будущее QtConcurrent кажется неопределенным, если вы читаете эта тема.
Наличие большего количества потоков для обработки ядер несколько избыточно. Если у вас работает одно ядро и два потока, процессор тратит время на переключение между обработкой двух потоков, но у пользователя появляется вид одновременной обработки.
При одинаковом количестве ядер и потоков потоки могут быть разделены между ядрами.
Как только у вас будет больше ядер, чем потоков, вы вернетесь к первоначальному методу ядер, перепрыгивающему вверх и назад между потоками, которые требуется обработать.
Использовать QThread на самом деле очень просто, так как QThread — это не поток, а контроллер потока. Вы можете прочитать о том, как ‘действительно действительно используйте QThreads’ здесь.
Как описано, вы создаете объекты, унаследованные от QObject, и перемещаете их в QThread. Что редко упоминается, так это то, что при необходимости вы можете переместить несколько объектов в новый QThread.
Других решений пока нет …