2013-03-21 87 views
0

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

我的事件系统应该是灵活的,允许某种实现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` 
} 

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

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

为什么这种方法比使用回调函数的仿函数更糟? 你会选择哪个实现,为什么?

回答

3

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

我已经使用Swing已经有相当长的时间了,所以我不能深入评论。使用Signals2,你仍然“创建”一个“监听器类”(通过定义一个信号类型;监听器是合成的插槽类型);并通过connect()方法将“听众”注册到给定的信号实例。

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

+0

谢谢boost :: signals2是我找到的最好的解决方案之一。 – insanebits 2013-03-21 23:23:43