Spec-Zone.ru › Qt 5.14

Тип WorkerScript QML

Позволяет использовать потоки в приложении Qt Quick. Подробнее...

Оператор импорта: import QtQml.WorkerScript 2.14
  • Список всех членов, включая унаследованные

Свойства

  • source : url

Сигналы

  • message(msg)

Методы

  • sendMessage(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: myText.text = messageObject.reply
    }

    MouseArea {
        anchors.fill: parent
        onClicked: 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". Он может использовать операторы импорта для доступа к функциональности из других модулей и выполняется в строгом режиме JavaScript.

Если у скрипта рабочего потока расширение ".js", то он считается содержащим обычные инструкции JavaScript и выполняется в режиме без строгой проверки.

Примечание: Каждый элемент WorkerScript создает отдельный движок JavaScript для обеспечения полной изоляции и безопасности потоков. Если это приводит к слишком большому потреблению памяти в вашей среде, рассмотрите возможность совместного использования элемента WorkerScript.

Ограничения

Поскольку функция WorkerScript.onMessage() выполняется в отдельном потоке, файл JavaScript оценивается в контексте, отличном от основного движка QML. Это означает, что, в отличие от обычного файла JavaScript, импортируемого в QML, script.mjs в приведённом выше примере не может получить доступ к свойствам, методам или другим атрибутам элемента QML, а также не может получить доступ к свойствам контекста, заданным для объекта QML через QQmlContext.

Кроме того, существуют ограничения на типы значений, которые могут передаваться в скрипт рабочего потока и из него. Подробности см. в документации к sendMessage().

Скрипты рабочих потоков, представляющие собой обычные источники JavaScript, не могут использовать синтаксис .import. Скрипты, являющиеся модулями ECMAScript, могут свободно использовать операторы импорта и экспорта.

См. также Примеры Qt Quick — Потоки и Пример Threaded ListModel.

Документация по свойствам

source : url

Здесь хранится URL-адрес файла JavaScript, реализующего обработчик WorkerScript.onMessage() для операций в потоке.

Если компонент имени файла в URL заканчивается на ".mjs", то скрипт интерпретируется как модуль ECMAScript и выполняется в строгом режиме. В противном случае он рассматривается как обычный скрипт.

Документация по сигналам

message(msg)

Этот сигнал испускается, когда сообщение msg получено из скрипта рабочего потока в другом потоке через вызов sendMessage().

Соответствующий обработчик — onMessage.

Документация по методам

sendMessage(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-5.14/qml-qtqml-workerscript-workerscript.html

Spec-Zone.ru

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