Spec-Zone.ru › Qt 6.0

Qt Concurrent

Модуль Qt Concurrent предоставляет высокоуровневые API, которые позволяют писать многопоточные программы без использования низкоуровневых потоковых примитивов, таких как мьютексы, чтец-записные блокировки, условия ожидания или семафоры. Программы, написанные с помощью Qt Concurrent, автоматически настраивают количество используемых потоков в соответствии с количеством доступных процессорных ядер. Это означает, что приложения, написанные сегодня, будут продолжать масштабироваться при развертывании на многоядерных системах в будущем.

Qt Concurrent включает API в стиле функционального программирования для параллельной обработки списков, включая реализацию MapReduce и FilterReduce для систем с общей памятью (не распределённых), и классы для управления асинхронными вычислениями в приложениях с графическим интерфейсом:

  • Конкуррентное отображение и Map-Reduce
    • QtConcurrent::map() применяет функцию ко каждому элементу в контейнере, изменяя элементы на месте.
    • QtConcurrent::mapped() аналогичен map(), за исключением того, что он возвращает новый контейнер с изменениями.
    • QtConcurrent::mappedReduced() аналогичен mapped(), за исключением того, что изменённые результаты сводятся или складываются в единственный результат.
  • Конкуррентное фильтрация и Filter-Reduce
    • QtConcurrent::filter() удаляет все элементы из контейнера на основе результата функции фильтрации.
    • QtConcurrent::filtered() аналогичен filter(), за исключением того, что он возвращает новый контейнер с отфильтрованными результатами.
    • QtConcurrent::filteredReduced() аналогичен filtered(), за исключением того, что отфильтрованные результаты сводятся или складываются в единственный результат.
  • Конкуррентный запуск
    • QtConcurrent::run() запускает функцию в другом потоке.
  • Конкуррентная задача
    • QtConcurrent::task() создаёт экземпляр QtConcurrent::QTaskBuilder. Этот объект можно использовать для настройки параметров и запуска задачи в отдельном потоке.
  • QFuture представляет результат асинхронного вычисления.
  • QFutureIterator позволяет итерироваться по результатам, доступным через QFuture.
  • QFutureWatcher позволяет отслеживать QFuture с помощью сигналов и слотов.
  • QFutureSynchronizer — это вспомогательный класс, который автоматически синхронизирует несколько QFuture.
  • QPromise предоставляет способ сообщать о прогрессе и результатах асинхронного вычисления QFuture. Позволяет приостановить или отменить задачу по запросу QFuture.

Qt Concurrent поддерживает несколько типов контейнеров и итераторов, совместимых со стандартной библиотекой шаблонов (STL), но лучше всего работает с контейнерами Qt, которые имеют итераторы произвольного доступа, такие как QList. Функции map и filter принимают как контейнеры, так и начальный/конечный итераторы.

Обзор поддержки итераторов STL:

Тип итератора Примеры классов Статус поддержки
Итератор ввода Не поддерживается
Итератор вывода Не поддерживается
Итератор вперёд std::slist Поддерживается
Двунаправленный итератор std::list Поддерживается
Итератор произвольного доступа QList, std::vector Поддерживается и рекомендуется

Итераторы произвольного доступа могут быть быстрее в случаях, когда Qt Concurrent итерируется по большому количеству лёгких элементов, так как они позволяют перейти к любой точке в контейнере. Кроме того, использование итераторов произвольного доступа позволяет Qt Concurrent предоставлять информацию о прогрессе через QFuture::progressValue() и QFutureWatcher::progressValueChanged().

Функции, не изменяющие контейнер на месте, такие как mapped() и filtered(), создают копию контейнера при вызове. Если вы используете контейнеры STL, эта операция копирования может занять некоторое время; в этом случае рекомендуется указывать начальный и конечный итераторы контейнера вместо самого контейнера.

Использование модуля

Использование модуля Qt требует привязки к библиотеке модуля, либо напрямую, либо через другие зависимости. Несколько инструментов построения имеют специальную поддержку для этого, включая CMake и qmake.

Компиляция с CMake

Используйте команду find_package() для поиска необходимых компонентов модуля в пакете Qt6.

find_package(Qt6 COMPONENTS Concurrent REQUIRED)
target_link_libraries(mytarget PRIVATE Qt6::Concurrent)

См. также обзор Компиляции с CMake.

Компиляция с qmake

Для настройки модуля для компиляции с qmake добавьте модуль в качестве значения переменной QT в файле проекта .pro:

QT += concurrent

Эволюция модуля

Изменения в Qt Concurrent перечисляет важные изменения в API и функциональности модуля, которые были внесены в серию Qt 6.

Лицензии

Модуль Qt Concurrent доступен по коммерческим лицензиям от The Qt Company. Кроме того, он доступен по лицензиям свободного программного обеспечения: GNU Lesser General Public License, версия 3 или GNU General Public License, версия 2. См. Qt Licensing для получения дополнительной информации.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qtconcurrent-index.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API