WorkerScript QML Type

Qt Quick アプリケーションでスレッドの使用を有効にする。詳細...

Import Statement: import QtQml.WorkerScript

プロパティ

信号

方法

詳しい説明

WorkerScriptを使用して、新しいスレッドで操作を実行します。これは、メインのGUIスレッドがブロックされないように、バックグラウンドで操作を実行するのに便利です。

メッセージは、sendMessage() とonMessage() ハンドラを使用して、新しいスレッドと親スレッドの間で渡すことができます。

例を挙げましょう:

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

上記のワーカースクリプトでは、新しいスレッドで実行される操作を処理する 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() が呼び出され、script.mjsWorkerScript.onMessage() ハンドラがトリガーされます。このメッセージは、myWorkeronMessage() ハンドラによって受信される。

この例では、".mjs "という拡張子を持つECMAScriptモジュールを使用している。このスクリプトはimport文を使って他のモジュールの機能にアクセスすることができ、JavaScriptのストリクトモードで実行されます。

ワーカースクリプトに ".js" という拡張子がある場合は、プレーンな JavaScript ステートメントが含まれているとみなされ、非厳密モードで実行されます。

注意: 各 WorkerScript 要素は、完全な分離とスレッドセーフを保証するために、個別の JavaScript エンジンをインスタンス化します。その影響でメモリ消費量が環境に対して高すぎる場合は、WorkerScript 要素の共有を検討してください。

制限事項

WorkerScript.onMessage() 関数は別スレッドで実行されるため、JavaScript ファイルはメインの QML エンジンとは別のコンテキストで評価されます。つまり、QMLに取り込まれる通常のJavaScriptファイルとは異なり、上記の例のscript.mjs はQMLアイテムのプロパティやメソッド、その他の属性にアクセスすることはできませんし、QQmlContext を通してQMLオブジェクトに設定されたコンテキストプロパティにアクセスすることもできません。

さらに、ワーカースクリプトとの間で受け渡しできる値のタイプにも制限があります。詳しくはsendMessage() のドキュメントを参照してください。

プレーンな JavaScript ソースであるワーカースクリプトは.import構文を使用できません。ECMAScript モジュールであるスクリプトは、import および export ステートメントを自由に使用できます。

プロパティ ドキュメント

ready : bool [read-only]

これは、WorkerScript が初期化され、WorkerScript.sendMessage() を介してメッセージを受信する準備ができているかどうかを保持します。


source : url

スレッド操作のためのWorkerScript.onMessage() ハンドラを実装する JavaScript ファイルの url を保持します。

urlのファイル名コンポーネントが".mjs "で終わっている場合、スクリプトはECMAScriptモジュールとして解析され、ストリクトモードで実行されます。そうでない場合は、プレーン・スクリプトとみなされます。


シグナル・ドキュメント

message(jsobject msg)

このシグナルは、sendMessage() の呼び出しによって、別のスレッドのワーカースクリプトからメッセージmsg を受信したときに発行されます。

注意: 対応するハンドラはonMessage です。


メソッド ドキュメンテーション

sendMessage(jsobject message)

与えられたmessage を別のスレッドのワーカースクリプトハンドラに送信します。他のワーカースクリプトハンドラは、onMessage() ハンドラを通してこのメッセージを受け取ることができます。

message オブジェクトは、以下の型の値のみを含むことができます:

  • boolean、数値、文字列
  • JavaScript オブジェクトと配列
  • ListModelオブジェクト(他のタイプのQObject*は許可されていません。)

すべてのオブジェクトと配列はmessage にコピーされます。ListModel オブジェクトを除き、message で渡されたオブジェクトに他のスレッドが変更を加えても、元のオブジェクトには反映されません。


© 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.