Spec-Zone.ru › Qt 5.14

Qt Concurrent

Начало работы

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

QtConcurrent включает 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() выполняет функцию в другом потоке.
  • QFuture представляет результат асинхронного вычисления.
  • QFutureIterator позволяет итерироваться по результатам, доступным через QFuture.
  • QFutureWatcher позволяет отслеживать QFuture с помощью сигналов-слотов.
  • QFutureSynchronizer — это удобный класс, который автоматически синхронизирует несколько QFuture.

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

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

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

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

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

Лицензии

Модуль Qt Concurrent доступен по коммерческим лицензиям от The Qt Company. Кроме того, он доступен по лицензиям свободного программного обеспечения. Начиная с Qt 5.4, эти лицензии свободного программного обеспечения являются GNU Lesser General Public License, version 3 или GNU General Public License, version 2. Подробнее см. Qt Licensing.

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

Spec-Zone.ru

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