« Direct3Dとくっつける | メイン | Widget Editor on Visual Studio »

2005年11月24日

Teaspire 開発日誌:: イベントハンドラの共有は不可

    

同じイベントハンドラをPushEventHandlerで複数のボタンに設定し、終了する時にRemoveEventHandlerですべてのボタンのイベントハンドラを取り外すと、アクセス違反が発生した。
RemoveEventHandlerで1個だけ取り外すようにするとアクセス違反は発生しなくなった。
そこで、1つのボタンに対してのみPushEventHandlerでイベントハンドラを設定してみたが、1つのボタンに対してしか有効でなかった。

コードを追ってみると……
PushEventHandlerでは、引数で指定されたハンドラをハンドラリストの先頭にして、今まであったハンドラをその次に指定している。
ハンドラのリストはハンドラ自体がポインタを持った双方向リストだ。
って、同じハンドラを複数のボタンに設定したらダメじゃん。
ちなみに、RemoveEventHandlerでは指定されたハンドラの後のハンドラを前のハンドラとつないでいる。
つまり、複数に設定したら、他のボタンのハンドラがつながってしまう。
さらに、RemoveEventHandlerの引数のハンドラを同じにして何度もコールしてしまうと、ハンドラリストにNULLが設定されてしまう。
そのせいで、アクセス違反が発生していたようだ。

そこで、PushEventHandlerに渡す時にnewし、終了時はPopEventHandler(true)で削除するようにした。
でも、こうなるとハンドラ内でIDで処理を振り分けている部分をファンクターか何かにして、newする時に渡した方が効率が良さそうだ。
見た目としては、IDで処理を分けた方が、コードがそこに集中して見やすくはあるが。


とりあえず、各ボタンで視点の変更は出来るようになった。
次は各オブジェ(モデル)を移動させたり回転させたり出来るようにする処理だ。
オブジェのピックが入ったり、マニピュレータを表示したり、マニピュレータのピックがあったりと少々やることが多い。



投稿者 Takenori : 2005年11月24日 01:21




comments powered by Disqus
Total : Today : Yesterday : なかのひと