2007年 01月 03日

rubyclr Timer でスレッドスイッチの問題

エラーでまくり (フォーム内の要素を参照した時点で落ちる)でだめなので原因を考える

  • Ruby インタプリタがびっくりすること
    • Ruby インタプリタだけの場合、スレッドをスイッチするのは Ruby インタプリタだけだけど、この場合 Timer による強制スイッチが入る
  • CLR 側がびっくりすること
    • Ruby インタプリタがスレッドスイッチでごっそりメモリいぢくること?

再現性100%の問題なので、タイミングがどうとかいう話ではない気がする。タイマーの Interval を変えてみても発生するので Ruby インタプリタがビックリしてるわけじゃなさそう。そもそも Ruby の例外は上がらない。

スレッドスイッチさせなければ普通に参照できるため、どっかでそのへんの何かが壊れてる予感。うーん

とりあえず、Ruby からスイッチ (pass) されたスレッド内でフォーム要素を参照しなければ落ちないみたいだ。つまり、本当のフォームの要素とは別に、状態設定用のインスタンス変数を作っておいて、実際のフォーム要素への反映はタイマーから起動されるクロージャ内でやれば大丈夫。
遠回りだけど(そしてこの回避方法で全てがうまくいくかわからない)