幾つかソースをいじりました。
・「毎日5時にタイマーコールバック」みたいなのは、registerRepeated
のオーバーロードされたバージョンを使って簡単に実装できます。
clock.registerRepeated(
new ClockHandler(onNewDay),
TimeSpan.untilTomorrow()+TimeSpan.fromHours(5),
TimeSpan.ONEDAY );
・起動時にスレッドを作らない。
新しい世界が作られた時に何かの処理をするには、World.onNewWorldに
ハンドラを追加する。
肝心のセーブの問題ですが、御指摘のようにタイマーコールバックは全てシリア
ライゼーションの対象になるので、そこに問題があります。
まず、BankbookWindowが直接タイマーを使って営業中/休業中の情報を更新する
のではなく、BankModuleが現在の営業状態をstatusプロパティとして持つほうが
よいでしょう。銀行がいつ営業中でどのタイミングで営業状態が切り替わるか、
などといったdetailはBankModuleの中に隠されているべきことだからです。
そして、eventを使って、外部のモジュールがstatusの変化を取得できるように
しましょう。このeventにpersistent(シリアライズ対象になるもの)と
non-persistent(ならないもの)の2種類を用意することによって、
BankbookWindowが安全にstatusの変化を取得することが出来ます。
本当は、抜本的な問題としてpersistentなdelegateとnon-persistentなdelegate
の2種類が作れるようになればいいのですが、どうも.NETではそういうことはで
きなさそうです。
川口耕介 / kk@kohsuke.org
_______________________________________________
FreeTrain-general mailing list
FreeTrain-general@lists.sourceforge.jp
http://lists.sourceforge.jp/mailman/listinfo/freetrain-general