WorkerScript QML Type
Qt Quick アプリケーションでスレッドを使用できるようにします。詳細...
Import Statement: | import QtQml.WorkerScript |
プロパティ
シグナル
- message(jsobject msg)
メソッド
- sendMessage(jsobject message)
詳細説明
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.mjs
のWorkerScript.onMessage()
ハンドラがトリガーされます。このメッセージは、myWorker
のonMessage()
ハンドラによって受信される。
この例では、".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 |
これは、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
で渡されたオブジェクトに他のスレッドが変更を加えても、元のオブジェクトには反映されません。
本書で提供されるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。