用c ++编写一个简单的事件调度程序 - 如何避免自引用和递归问题?

时间:2012-05-23 09:13:22

标签: c++ events event-handling

我试图用C ++编写一个简单的事件调度程序。我对这个特殊的舞台很新,所以请原谅我的无知。

对于调度过程,我有以下界面:

class listener
{
    public:
       virtual void triggerEvent(int id)=0;
};

然后加入它,我只是实现它:

class A : public listener
{
    public:
           A();
           void triggerEvent(int event);
           .
           .
           .
           B* b;
};

在一个具有一个名为listener_的侦听器指针的类中,该指针指向A对象,A中的事件可以如图所示触发,

 void B::method()
 {
       .
       .
       .
       listener_->triggerEvent(DO_SOMETHING); // calling point
 }

但现在问题是,A还有一个指向B对象的指针,这样当调用A的triggerEvent实现时,B :: method()再次被调用,即:

 void A::triggerEvent(int id)
 {
      if(id==DO_SOMETHING)b->method();
 }

这会导致递归问题。

理想情况下,我希望B :: method()中的'调用点'能够立即从堆栈中释放出来。我该怎么做才能防止上述递归问题?我的事件调度员设计有什么不正确之处?我该如何解决?

编辑:上面显示的是一个非常极端的例子。在实际情况中,A实际上可能是一些“控制线程”。然后,B可能是一个单独的算法,需要在控制线程完成时向控制线程指示,以便A可以继续进行进一步的操作。 B ::方法也可能是一个帖子。

谢谢,并祝福,

本。

1 个答案:

答案 0 :(得分:0)

您正在实施观察者模式

  

我的事件调度员设计有什么不正确之处?

您调用触发事件处理程序内事件的方法。你通过不调用方法来修复它。