找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5882|回复: 11

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

[复制链接]
发表于 2009-4-15 14:32:25 | 显示全部楼层 |阅读模式
如下:

//观察者
CompletionCallBack cb;

//期货
LongWork work;

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

......

我想请教高人们的是:
把观察者系到期货上后,是只能自动调用一次后,还需要再系,还是说系一次就可以多次被自动调用?
谢谢~~~
发表于 2009-4-15 17:57:13 | 显示全部楼层
可以多次被调用。
如果需要解除关系的话,
调用detach就可以了。
 楼主| 发表于 2009-4-17 10:57:27 | 显示全部楼层
还想请教一下
一个观察者是不是可以对应非常多的期货呢?
还是说一对一的关系呢?

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

望指点,谢谢~~~
发表于 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 编辑 ]
 楼主| 发表于 2009-4-21 15:31:35 | 显示全部楼层

回复 #4 modern 的帖子

谢谢~~~
我回去好好看一下~~~
 楼主| 发表于 2009-4-23 11:01:44 | 显示全部楼层

回复 #4 modern 的帖子

还想问一下,
我的一个期货和一个观察者最初绑定后,
当第一次调用期货中的 call() 后,观察者是有响应的,
不过等一会儿再调用 call() 后,观察者就没有响应了。
这是为什么呀? 是不是我少做了什么操作呢?
期货中的 ACE_Future<char*> result_; 一直是一个成员变量。
发表于 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;
}
 楼主| 发表于 2009-4-29 10:34:00 | 显示全部楼层
谢,我回都研究一下~~~
发表于 2009-6-26 14:34:21 | 显示全部楼层
汗。。。期货是什么,英文是future么?
Future是干什么的,书上好像没有讲过啊?
发表于 2009-6-26 14:44:02 | 显示全部楼层
APG上面有。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-23 17:42 , Processed in 0.721907 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表