kleavings 发表于 2009-4-15 14:32:25

关于期货和观察者的关系,请指教

如下:

//观察者
CompletionCallBack cb;

//期货
LongWork work;

//把观察者系到期货上
work.attach(&cb);

......

我想请教高人们的是:
把观察者系到期货上后,是只能自动调用一次后,还需要再系,还是说系一次就可以多次被自动调用?
谢谢~~~

modern 发表于 2009-4-15 17:57:13

可以多次被调用。
如果需要解除关系的话,
调用detach就可以了。

kleavings 发表于 2009-4-17 10:57:27

还想请教一下
一个观察者是不是可以对应非常多的期货呢?
还是说一对一的关系呢?

如果对 期货 加了时间限制,超了时他就返回了,
那对本身我执行的程序依旧执行着,那么如果他依旧 调用了期货的 call()
会怎么样呢?

望指点,谢谢~~~

modern 发表于 2009-4-20 15:53:40

需要说明几点:
1.建议楼主看一下gof的观察者模式,对理解这段代码是有帮助的。
2.一个观察者对应多个期货是没问题的,看例子$(ACE_ROOT)\examples\APG\Active_Objects
目录下AO2的例子就可以了。
3.不过例子是建立在Scheduler启动了一个线程的基础上的,当然这没有问题,你会得到你想要的效果。
如果考虑调度者Scheduler启动了一个线程池,那么面临的问题就会复杂一些,
如是否需要对观察者的实例进行多线程保护等,这个得根据自己具体的设计测试一下效果。
4对期货加了时间的限制,没太理解如何加时间的限制,需要说明的具体点。

[ 本帖最后由 modern 于 2009-4-20 16:03 编辑 ]

kleavings 发表于 2009-4-21 15:31:35

回复 #4 modern 的帖子

谢谢~~~
我回去好好看一下~~~

kleavings 发表于 2009-4-23 11:01:44

回复 #4 modern 的帖子

还想问一下,
我的一个期货和一个观察者最初绑定后,
当第一次调用期货中的 call() 后,观察者是有响应的,
不过等一会儿再调用 call() 后,观察者就没有响应了。
这是为什么呀? 是不是我少做了什么操作呢?
期货中的 ACE_Future<char*> result_; 一直是一个成员变量。

modern 发表于 2009-4-23 13:58:02

下面是set的源代码,从源代码分析,你的结果是正确的,我之前的认识是有偏差的。
只有在第一次set的时候,才会广播所有的观察者。

需要注意的是代码的注释说,广播之后会删除所有观察者,但是我从代码里并没有看到这一点。
我做了测试验证了确实观察者并没有从队列中被移除,
因此只要你在取出值之后,将value_ 置为0,下次观察者即可以被调用到。
不过很可惜,尽管ACE_Future提供了get_rep函数,可以获得内部ACE_Future_Rep<T>的指针,
不过这样使用的隐患太大,而且并没提供类似功能的函数,
所以要实现这个功能可能得自己动手改一下源代码了。


template <class T> int
ACE_Future_Rep<T>::set (const T &r,
                        ACE_Future<T> &caller)
{
// If the value is already produced, ignore it...
if (this->value_ == 0)
    {
      ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex,
                              ace_mon,
                              this->value_ready_mutex_,
                              -1));
      // Otherwise, create a new result value.Note the use of the
      // Double-checked locking pattern to avoid multiple allocations.

      if (this->value_ == 0)       // Still no value, so proceed
      {
          ACE_NEW_RETURN (this->value_,
                        T (r),
                        -1);

          // Remove and notify all subscribed observers.
          typename OBSERVER_COLLECTION::iterator iterator =
            this->observer_collection_.begin ();

          typename OBSERVER_COLLECTION::iterator end =
            this->observer_collection_.end ();

          while (iterator != end)
            {
            OBSERVER *observer = *iterator++;
            observer->update (caller);
            }

          // Signal all the waiting threads.
          return this->value_ready_.broadcast ();
      }
      // Destructor releases the lock.
    }
return 0;
}

kleavings 发表于 2009-4-29 10:34:00

谢,我回都研究一下~~~

wishel 发表于 2009-6-26 14:34:21

汗。。。期货是什么,英文是future么?
Future是干什么的,书上好像没有讲过啊?

winston 发表于 2009-6-26 14:44:02

APG上面有。
页: [1] 2
查看完整版本: 关于期货和观察者的关系,请指教