Skip to content
uupaa edited this page Feb 2, 2017 · 32 revisions

Thread は ブラウザの MainThread(UI Thread) 上で動作するように設計されたクラスです。ユースケース も参照してください。

Namespace

Entity of Thread module is located in the global.WebModule.Thread.
If you want publish to global namespace.

Thread モジュールの実体は、global.WebModule.Thread にあります。
global 名前空間に直接公開する事もできます。その場合は global.Thread でもアクセス可能になります。

API

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

new Thread

new Thread(script:URLString, postMessageHandler:Function = null, closeMessageHandler:Function = null) は Thread インスタンスを生成します。

  • Thread クラスは Main Thread側で使用します。Worker側では ThreadProxy を使用してください
  • script には Worker script の URL を指定します
  • postMessageHandler にはWorker側からコールバックされる関数を指定します。コールバックは postMessageHandler(args:Any, event:Event):void の形で呼びだれされます
    • この関数は ThreadProxy#post から呼ばれます
    • コールバック引数 args には、ThreadProxy#post(args, ...) で渡された args が格納されています
    • コールバック引数 event には、onmessage(event) で渡された event が格納されています
  • closeMessageHandler にはワーカースレッド終了時にコールバックされる関数を指定します。コールバックは closeMessageHandler(exitCode:Integer):void の形で呼びだれされます
    • exitCode にはワーカースレッドの終了理由が記載されています
var thread = new Thread("worker.js", function postMessageHandler(args, event) {
        console.log(args);
    }, function closeMessageHandler(exitCode) {
        if (exitCode !== Thread.EXIT_OK) {
            alert("error: " + exitCode);
        }
    });

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

Thread.prototype.post

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

  • args には Structured cloneがサポートしている型の一覧 にある任意の値を指定できます
  • transfer の要素に ArrayBuffer を指定すると、ArrayBuffer の所有権をワーカースレッドに譲渡することで、ゼロコピーを実現できます。Transferable を参照してください
  • スレッド側から postback からコールバックされる関数を指定します
    • コールバック時の引数は postbackMessageHandler(args:Any, event:Event):void の形になります
  • ttl には postbackMessageHandler が機能する回数を指定できます。デフォルトは1です。
    • ttlの回数を超えて postback が呼ばれた場合は postbackMessageHandler ではなく (new Thread(...) で指定した) postMessageHandler が代わりに呼ばれます
// index.js
var thread = new Thread("worker.js", function postMessageHandler(args, event) {
        console.log(args[0]); // "HELLO POST";
    }, function closeMessageHandler(exitCode) {
        //
    });

var ttl = 2;

thread.post(["Job1"]);
thread.post(["Job2"], null, function postbackMessageHandler(args, event) {
    console.log(args[0]); // "HELLO POSTBACK" x 2
}, ttl);
// 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");
                     event.postback("HELLO POSTBACK");
        }
    }, function closeRequestHandler(yes, no) {
        yes();
    });

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 を返します。

var thread = new Thread("worker.js");

thread.close();

setTimeout(function() {
    console.log( thread.active ); // false (maybe)
}, 1000);
Clone this wiki locally