0

ブレンダーの GHOST システムに基づいてシンプルな GUI システムを作成していますが、この質問ではそれほど重要ではないと思います。GHOST自体はシンプルなイベントシステムです。

私のイベント システムは柔軟である必要があり、MVC パターンの何らかの実装、スマートなメモリ割り当て解除が可能であり、クロスプラットフォームで動作し、c++0x で記述されている必要があります

次の例は、イベントを処理する GHOST から継承されたメソッドを示しています。

bool Application::processEvent(GHOST_IEvent *event)
{
    GHOST_IWindow *window = event->getWindow();
    bool handled = true;

    switch (event->getType()) {

        case GHOST_kEventWheel:
        {
            mouseDriver->handleWheel((GHOST_TEventWheelData *) event->getData());
        }
        break;  
        case GHOST_kEventButtonDown:
        {
            mouseDriver->handleButtonDown((GHOST_TEventButtonData *) event->getData());
        }
        break;  
        case GHOST_kEventButtonUp:
        {
            mouseDriver->handleButtonUp((GHOST_TEventButtonData *) event->getData());
        }
        break;

        case GHOST_kEventCursorMove:
        {
              mouseDriver->handleCursorMove((GHOST_TEventCursorData *) event->getData());
        } 
        break;

        case GHOST_kEventKeyUp:
        {
            keyDriver->handleKeyUp((GHOST_TEventKeyData *) event->getData());       
        }
        break;
        case GHOST_kEventKeyDown:
        {
            keyDriver->handleKeyDown((GHOST_TEventKeyData *) event->getData()); 
        }
        break;
    }
    return true;//currently not used while experimenting`
}

GHOST イベントを処理し、イベントに関心のある人に通知する KeyDriver と MouseDriver の 2 つのクラスを作成しました。ここで本当の問題は、ドライバー クラスからさらにイベント分散を実装するためのベスト プラクティスは何かということです。私は、イベント システムがhttp://accu.org/index.php/journals/464またはC++ イベント システムのように機能する方法に関するいくつかの記事とソリューションを読みました。デザインですが、どちらを選択すればよいのか、なぜ一方が他方より優れているのかわかりません。

私はJavaのSwingのようにそれをやろうと考えました。コンポーネントイベントをリッスンするためにリスナークラスが作成および登録され、リスナークラスはいくつかのクラスから継承する必要があります。

このメソッドは、コールバック関数が使用されるファンクターよりも悪いのはなぜですか? どの実装を選択しますか?またその理由は?

4

1 に答える 1

3

Boost.Signals2 を使用します (これは、既に参照した StackOverflow の質問に対して受け入れられた回答でした)。私がこれを使い始めたのは、3 ~ 4 年前に初めて Boost ライブラリを学んでいたときでした。シンプルで、柔軟で、エレガントで、信頼できることが証明されました。別の解決策を探す理由はありませんでした。

Swing を使用してからかなりの時間が経過しているため、詳しくコメントすることはできません。Signals2 を使用しても、「リスナー クラス」を「作成」します (シグナル タイプを定義することにより、リスナーは結果のスロット タイプになります)。メソッドを介して特定のシグナルインスタンスにリスナーを「登録」しますconnect()

Signals2 を使用すると、各シグナルは複数のパラメーターを受け入れることができ、必要に応じてシグナル送信者に結果を返すことができます。接続のメンテナンスには多くの柔軟性があります。

于 2013-03-21T22:10:40.657 に答える