Skip to content
uupaa edited this page Jun 10, 2015 · 32 revisions

Thread.js の API の一覧です。Examples も参照してください。

  • Thread.js
    • new Thread インスタンスを作成します
    • Thread#post ワーカースレッドにメッセージを送信します
    • Thread#close ワーカースレッドを終了します
    • Thread#active ワーカースレッドがアクティブならtrueになります

new Thread

new Thread(...) で Thread インスタンスを生成します。Thread クラスは メインスレッドで使用します。WebWorkers の中では使用できません。

function Thread(script,                // @arg URLString - Workers script
                postMessageHandler,    // @arg Function = null - post message handler. postMessageHandler(args:AnyArray, event:Event):void
                closeMessageHandler) { // @arg Function = null - close message handler. closeMessageHandler(exitCode:Integer):void
}
  • postMessageHandler には postMessageHandler(args:AnyArray, event:Event):void を引数にとるコールバック関数を指定します
    • postMessageHandler は ThreadProxy#post から呼ばれます
    • args には、ThreadProxy#post から渡された args がそのまま格納されています
  • closeMessageHandler には closeMessageHandler(exitCode:Integer):void を引数にとるコールバック関数を指定します
    • closeMessageHandler はワーカースレッドが終了したタイミングで呼ばれます
    • exitCode にはワーカースレッドの終了コードが格納されています
exitCode value
Thread.EXIT_OK 0 ワーカースレッドは正常終了しました
Thread.EXIT_ERROR 1 例外が発生したためワーカースレッドを強制終了しました
Thread.EXIT_FORCE 2 ユーザの指示でワーカースレッドを強制終了しました。
Thread#close(-1) による強制終了で、この終了コードで発生します
Thread.EXIT_TIMEOUT 3 タイムアウトしたためワーカースレッドを強制終了しました。
Thread#close(timeout) で、この終了コードが発生します
var thread = new Thread("worker.js", function postMessageHandler(args, event) {
        console.log(args);
    }, function closeMessageHandler(exitCode) {
        if (exitCode !== 0) {
            alert("error: " + exitCode);
        }
    });

thread.post(["HELLO", "WORKER"]);

Thread.prototype.post

Thread#post(args:AnyArray = null, transfer:TransferableObjectArray = null, postbackMessageHandler:Function = null):void は、ワーカースレッドにメッセージを送信します。

  • args には Structured cloneがサポートしている型の一覧 にある任意の値を配列で指定可能です
  • transfer に ArrayBuffer の配列を指定すると、メモリを譲渡する事ができます。この機能によりメモリコピーを抑止できます
  • postbackMessageHandler には postbackMessageHandler(args:AnyArray, event:Event):void を引数にとるコールバック関数を指定できます
    • ポストバックがあった場合は、 postbackMessageHandler(args:AnyArray, event:Event):void の形でコールバックされます
<script src="lib/WebModule.js"></script>
<script src="lib/Thread.js"></script>
<script>

/// index.html
var thread = new Thread("worker.js", function postMessageHandler(args, event) {
        console.log(args[0]); // "HELLO POST";
    }, function closeMessageHandler(exitCode) {
        //
    });

thread.post(["Job1"]);
thread.post(["Job2"], null, function postbackMessageHandler(args, event) {
    console.log(args[0]); // "HELLO POSTBACK";
});
</script>
/// worker.js
importScript(./lib/WebModule.js");
importScript(./lib/ThreadProxy.js");

var proxy = new ThreadProxy(function postMessageHandler(args, event) {
        switch (args[0]) {
        case "Job1": proxy.post("HELLO POST"); break;
        case "Job2": event.postback("HELLO POSTBACK");
        }
    }, function closeRequestHandler(yes, no) {
        //
    });

postback

Thread#post の第三引数(postbackMessageHandler) を指定し、ワーカースレッド側で、event.postback を使いメッセージをメインスレッドに送り返す機能をポストバックと呼びます。

ポストバックを使うと、ワーカースレッドでメッセージを処理した結果をメインスレッドに送り返す事ができます。

こちらの例 も参照してください。

Thread.prototype.close

Thread#close(timeout:Integer = 10000):void を行うとワーカースレッドを終了させる事ができます。

  • Thread#close() を使用すると、ThreadProxy の closeRequestHandler(yes, no) が呼ばれます
  • timeout にはワーカースレッドが終了するまでの待機時間をms単位で指定できます。1000を指定すると1秒間待機します
    • 待機時間を過ぎても応答がない場合はワーカースレッドを強制終了し、exitCode を Thread.EXIT_TIMEOUT に設定します
    • timeout に -1 を指定すると即座にワーカースレッドを強制終了し、exitCode を Thread.EXIT_FORCE に設定します
      • -1 を指定した場合は、closeRequestHandler を呼ばずに直接終了させます

強制終了する例タイムアウトさせる例 を参照してください。

Thread.prototype.active

Thread#active:Boolean はワーカースレッドが終了していれば false を、終了していなければ true を返します。

Clone this wiki locally