Тип WorkerScript QML
Позволяет использовать потоки в приложении Qt Quick. Подробнее...
| Заявление об импорте: | import QtQml.WorkerScript 2.1 |
Свойства
Сигналы
- message(jsobject msg)
Методы
- sendMessage(jsobject message)
Подробное описание
Используйте WorkerScript для выполнения операций в новом потоке. Это полезно для выполнения операций в фоновом режиме, чтобы основной поток GUI не блокировался.
Сообщения могут передаваться между новым потоком и родительским потоком с помощью sendMessage() и обработчика onMessage().
Пример:
import QtQuick 2.0
Rectangle {
width: 300; height: 300
Text {
id: myText
text: 'Click anywhere'
}
WorkerScript {
id: myWorker
source: "script.mjs"
onMessage: (messageObject)=> myText.text = messageObject.reply
}
MouseArea {
anchors.fill: parent
onClicked: (mouse)=> myWorker.sendMessage({ 'x': mouse.x, 'y': mouse.y })
}
} Вышеприведенный скрипт рабочего потока указывает на JavaScript-файл «script.mjs», который обрабатывает операции, которые должны выполняться в новом потоке. Вот script.mjs:
WorkerScript.onMessage = function(message) {
// ... long-running operations and calculations are done here
WorkerScript.sendMessage({ 'reply': 'Mouse is at ' + message.x + ',' + message.y })
} Когда пользователь нажимает где-либо в прямоугольнике, sendMessage() вызывается, вызывая обработчик WorkerScript.onMessage() в script.mjs. Это, в свою очередь, отправляет ответное сообщение, которое затем получает обработчик onMessage() в myWorker.
В примере используется скрипт, который представляет собой модуль ECMAScript, потому что имеет расширение «.mjs». Он может использовать инструкции import для доступа к функциональности из других модулей и выполняется в строгом режиме JavaScript.
Если скрипт рабочего потока имеет расширение «.js» вместо этого, то он рассматривается как содержащий простые операторы JavaScript, и он выполняется в нестрогом режиме.
Примечание: Каждый элемент WorkerScript будет инициализировать отдельный движок JavaScript для обеспечения полной изоляции и безопасности потоков. Если это оказывает слишком большое влияние на потребление памяти вашей среды, рассмотрите возможность совместного использования элемента WorkerScript.
Ограничения
Поскольку функция WorkerScript.onMessage() выполняется в отдельном потоке, JavaScript-файл оценивается в контексте, отличном от основного движка QML. Это означает, что, в отличие от обычного JavaScript-файла, импортированного в QML, script.mjs в приведенном выше примере не может получить доступ к свойствам, методам или другим атрибутам элемента QML, а также не может получить доступ к свойствам контекста, установленным в объекте QML с помощью QQmlContext.
Кроме того, существуют ограничения на типы значений, которые могут передаваться в скрипт рабочего потока и из него. Подробности см. в документации к sendMessage().
Скрипты рабочих потоков, которые являются обычными JavaScript-источниками, не могут использовать синтаксис .import. Скрипты, являющиеся модулями ECMAScript, могут свободно использовать инструкции import и export.
См. также Примеры Qt Quick - Потоки и Пример Threaded ListModel.
Документация свойств
ready : bool
Здесь указывается, был ли WorkerScript инициализирован и готов к получению сообщений через WorkerScript.sendMessage().
source : url
Здесь указан URL JavaScript-файла, реализующего обработчик WorkerScript.onMessage() для операций в потоке.
Если компонент имени файла в URL заканчивается на «.mjs», то скрипт анализируется как модуль ECMAScript и выполняется в строгом режиме. В противном случае он рассматривается как обычный скрипт.
Документация сигналов
message(jsobject msg)
Этот сигнал испускается, когда сообщение msg получено из скрипта рабочего потока в другом потоке через вызов sendMessage().
Примечание: Соответствующий обработчик — onMessage.
Документация методов
sendMessage(jsobject message)
Отправляет указанное message в обработчик скрипта рабочего потока в другом потоке. Другой обработчик скрипта рабочего потока может получить это сообщение через обработчик onMessage().
Объект message может содержать только значения следующих типов:
- boolean, number, string
- объекты и массивы JavaScript
- объекты ListModel (любой другой тип QObject* не допускается)
Все объекты и массивы копируются в message. За исключением объектов ListModel, любые изменения в другом потоке в объекте, переданном в message, не будут отражены в исходном объекте.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qml-qtqml-workerscript-workerscript.html