2006-09-27

イベント配信とオブジェクトの寿命

今使っているイベント配信機構がもうずっと長いこと気に入らない。何が気に入らないかって言うとイベントリスナー(ハンドラ)登録部分。いちいちリスナーインタフェースから継承して、オーバーライドするのが面倒。なのでメンバ関数ポインタ呼び出しをヒープへの割り当て無しでラッピングするテンプレートクラスを書いて(boost::functionに効率の良いallocatorを指定する方が良いかどうか迷った)、それをリスナー登録の時に使おうとしたのだけど、実はリスナーインタフェースの基底クラスはデストラクタで自分宛のメッセージをキューから削除する処理を行っているんだった。ダメじゃん。デストラクタにその処理を行う関数呼び出しを毎回書くとか、それだけのために何かを継承するのだったら今までと変わらないよ。むしろ忘れる危険性があるし。それだったら今までの方がシンプルで効率も良く、安全だ。別に自由なメンバ関数を呼んでもらえないことが困るってほどでもないし。ということでせっかく書いたテンプレートクラスはお蔵入りです。時間を無駄にした。いや、勉強になった。

結局このあたりはオブジェクトの寿命管理の呪縛から逃れられないんだよね。イベントをきっかけにイベントハンドラになっているオブジェクトを削除するなんて事は良くあるわけだし。boost::signalですらtrackableを必要とする。さらにイベントハンドラがイベント発生元を削除したいケースも良くある。GCがあれば何て事は無いんだろうけどなぁ。侵入型の参照カウンタで自分自身をロックするくらいでも何とかなる?

ちなみにQtだとこんな感じらしいです。つまりはイベントの通知は自分が削除されても良いタイミングで行え、それが出来なければタイマーか何かで遅延するか、自分が削除されたことを検知せよ。頭痛い。いや、興味深い。