WorkerScript QML Type

Ermöglicht die Verwendung von Threads in einer Qt Quick Anwendung. Mehr...

Import Statement: import QtQml.WorkerScript

Eigenschaften

Signale

Methoden

Ausführliche Beschreibung

Verwenden Sie WorkerScript, um Operationen in einem neuen Thread auszuführen. Dies ist nützlich, um Operationen im Hintergrund auszuführen, damit der Haupt-GUI-Thread nicht blockiert wird.

Nachrichten können zwischen dem neuen Thread und dem Eltern-Thread mit sendMessage() und dem onMessage() Handler weitergegeben werden.

Ein Beispiel:

import QtQuick

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 })
    }
}

Das obige Worker-Skript gibt eine JavaScript-Datei, "script.mjs", an, die die im neuen Thread auszuführenden Operationen verarbeitet. Hier ist script.mjs:

WorkerScript.onMessage = function(message) {
    // ... long-running operations and calculations are done here
    WorkerScript.sendMessage({ 'reply': 'Mouse is at ' + message.x + ',' + message.y })
}

Wenn der Benutzer auf eine beliebige Stelle innerhalb des Rechtecks klickt, wird sendMessage() aufgerufen, wodurch der Handler WorkerScript.onMessage() in script.mjs ausgelöst wird. Dieser wiederum sendet eine Antwortnachricht, die dann vom onMessage() -Handler von myWorker empfangen wird.

Das Beispiel verwendet ein Skript, das ein ECMAScript-Modul ist, da es die Erweiterung ".mjs" hat. Es kann Import-Anweisungen verwenden, um auf Funktionen anderer Module zuzugreifen, und es wird im JavaScript-Strict-Modus ausgeführt.

Wenn ein Worker-Skript stattdessen die Erweiterung ".js" hat, wird davon ausgegangen, dass es einfache JavaScript-Anweisungen enthält, und es wird im nicht-strikten Modus ausgeführt.

Hinweis: Jedes WorkerScript-Element instanziiert eine separate JavaScript-Engine, um perfekte Isolation und Thread-Sicherheit zu gewährleisten. Wenn dies zu einem für Ihre Umgebung zu hohen Speicherverbrauch führt, sollten Sie die gemeinsame Nutzung eines WorkerScript-Elements in Betracht ziehen.

Beschränkungen

Da die Funktion WorkerScript.onMessage() in einem separaten Thread ausgeführt wird, wird die JavaScript-Datei in einem von der Haupt-QML-Engine getrennten Kontext ausgewertet. Das bedeutet, dass im Gegensatz zu einer gewöhnlichen JavaScript-Datei, die in QML importiert wird, script.mjs im obigen Beispiel nicht auf die Eigenschaften, Methoden oder andere Attribute des QML-Elements zugreifen kann und auch nicht auf Kontexteigenschaften, die für das QML-Objekt über QQmlContext festgelegt wurden.

Darüber hinaus gibt es Beschränkungen für die Arten von Werten, die an das Worker-Skript übergeben und von diesem zurückgegeben werden können. Einzelheiten finden Sie in der Dokumentation sendMessage().

Worker-Skripte, die reine JavaScript-Quellen sind, können keine .import-Syntax verwenden. Skripte, die ECMAScript-Module sind, können Import- und Export-Anweisungen frei verwenden.

Eigenschaft Dokumentation

ready : bool [read-only]

Hier wird festgehalten, ob WorkerScript initialisiert wurde und für den Empfang von Nachrichten über WorkerScript.sendMessage() bereit ist.


source : url

Hier wird die URL der JavaScript-Datei angegeben, die den WorkerScript.onMessage() Handler für Threaded Operations implementiert.

Wenn die Dateinamenkomponente der URL mit ".mjs" endet, wird das Skript als ECMAScript-Modul geparst und im Strict-Modus ausgeführt. Andernfalls wird es als einfaches Skript betrachtet.


Signal Dokumentation

message(jsobject msg)

Dieses Signal wird ausgegeben, wenn eine Nachricht msg von einem Arbeitsskript in einem anderen Thread durch einen Aufruf von sendMessage() empfangen wird.

Hinweis: Der entsprechende Handler ist onMessage.


Methode Dokumentation

sendMessage(jsobject message)

Sendet das angegebene message an einen Worker-Script-Handler in einem anderen Thread. Der andere Worker-Script-Handler kann diese Nachricht über den onMessage()-Handler empfangen.

Das Objekt message darf nur Werte der folgenden Typen enthalten:

  • Boolean, Zahl, String
  • JavaScript-Objekte und Arrays
  • ListModel-Objekte (jeder andere Typ von QObject* ist nicht erlaubt)

Alle Objekte und Arrays werden in message kopiert. Mit Ausnahme von ListModel-Objekten werden alle Änderungen, die der andere Thread an einem in message übergebenen Objekt vornimmt, nicht in das Originalobjekt übernommen.


© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.