拡張機能開発: nsIThreadManager利用時における定義済みコアオブジェクトの挙動
Firefoxの拡張機能を相変わらず作っております。
スレッドではまったのでメモ。
時間がかかる処理を行うので、Firefox3から導入されたnsIThreadManagerを利用して、マルチスレッディングで楽しようとコーディング。
MDC: The Thread Manager
https://developer.mozilla.org/ja/The_Thread_Manager
本家のサンプルのほぼそのまんまです。
で、です。
スレッド処理に切り替える前、デバッグ出力する際に、String(obj) として文字列に変換してやっていました。objがnullな可能性もあったので。
var obj = null; dump("obj=" + String(obj)); // ここで停止
そして、スレッドで処理するように書き換えた後、このコードを実行してみると、そこでプログラムが停止。Firefoxすら反応しなくなる。
原因が、よく分からないながら、String()を外すと動き出す。
同様に、
var x = Math.ceil( xxxx/ yyyy);
な感じの処理をおこなっている場所でも、停止。
どーやら、スレッド内で、デフォルトで用意されている「定義済みコアオブジェクト」というものに触れると停止するよう。
註: DOM はスレッドセーフではないので、バックグラウンドスレッドから DOM や ユーザーインタフェースにアクセスしてはいけません。クラッシュの原因となります。
MDCのページのこの1文がすごく気になる。
まさか、 「定義済みコアオブジェクト」はスレッドセーフではない? とか?
ソースでも読んで確認してみたほうがいいのかしら・・・。