c ++的事件系统

时间:2013-03-21 20:37:46

标签: c++

我正在基于blender的GHOST系统创建简单的GUI系统,我认为在这个问题上并不是很重要。 GHOST本身就有简单的事件系统。

我的事件系统应该是灵活的,允许某种MVC模式的实现,智能内存释放,应该跨平台工作,应该用c ++ 0x编写

Folowing示例显示来自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`
}

我写了两个类KeyDriver和MouseDriver,它们应该处理GHOST事件并通知那些对事件感兴趣的人。现在真正的问题是从驱动程序类实现进一步事件分发的最佳实践,我已经阅读了几篇文章和解决方案,事件系统如何工作,如http://accu.org/index.php/journals/464 C++ event system design 但我不知道选择哪一个,为什么一个比其他更好。

我曾经想过像java中的Swing那样做。在哪里创建并注册监听器类以监听组件事件,并且监听器类必须从某个类继承。

为什么这种方法比使用回调函数的仿函数更糟? 您会选择哪种实施方式?为什么?

1 个答案:

答案 0 :(得分:3)

我使用Boost.Signals2(这是您已经引用的that StackOverflow question的已接受答案)。当我三四年前第一次学习Boost库时,我开始使用它,它被证明是简单,灵活,优雅和可靠的;我没有理由寻找其他解决方案。

自从我使用Swing已经有一段时间了,所以我无法深入评论。使用Signals2,你仍然“创建”一个“监听器类”(通过定义一个信号类型;监听器是结果槽类型);并通过connect()方法“注册”给定信号实例的监听器。

使用Signals2,每个信号都可以接受多个参数,如果需要,可以将结果返回给信号器。连接维护有很大的灵活性。