rubyclr Timer でスレッドスイッチの問題
エラーでまくり (フォーム内の要素を参照した時点で落ちる)でだめなので原因を考える
- Ruby インタプリタがびっくりすること
- Ruby インタプリタだけの場合、スレッドをスイッチするのは Ruby インタプリタだけだけど、この場合 Timer による強制スイッチが入る
- CLR 側がびっくりすること
- Ruby インタプリタがスレッドスイッチでごっそりメモリいぢくること?
再現性100%の問題なので、タイミングがどうとかいう話ではない気がする。タイマーの Interval を変えてみても発生するので Ruby インタプリタがビックリしてるわけじゃなさそう。そもそも Ruby の例外は上がらない。
スレッドスイッチさせなければ普通に参照できるため、どっかでそのへんの何かが壊れてる予感。うーん
とりあえず、Ruby からスイッチ (pass) されたスレッド内でフォーム要素を参照しなければ落ちないみたいだ。つまり、本当のフォームの要素とは別に、状態設定用のインスタンス変数を作っておいて、実際のフォーム要素への反映はタイマーから起動されるクロージャ内でやれば大丈夫。
遠回りだけど(そしてこの回避方法で全てがうまくいくかわからない)