关于期货和观察者的关系,请指教
如下://观察者
CompletionCallBack cb;
//期货
LongWork work;
//把观察者系到期货上
work.attach(&cb);
......
我想请教高人们的是:
把观察者系到期货上后,是只能自动调用一次后,还需要再系,还是说系一次就可以多次被自动调用?
谢谢~~~ 可以多次被调用。
如果需要解除关系的话,
调用detach就可以了。 还想请教一下
一个观察者是不是可以对应非常多的期货呢?
还是说一对一的关系呢?
如果对 期货 加了时间限制,超了时他就返回了,
那对本身我执行的程序依旧执行着,那么如果他依旧 调用了期货的 call()
会怎么样呢?
望指点,谢谢~~~ 需要说明几点:
1.建议楼主看一下gof的观察者模式,对理解这段代码是有帮助的。
2.一个观察者对应多个期货是没问题的,看例子$(ACE_ROOT)\examples\APG\Active_Objects
目录下AO2的例子就可以了。
3.不过例子是建立在Scheduler启动了一个线程的基础上的,当然这没有问题,你会得到你想要的效果。
如果考虑调度者Scheduler启动了一个线程池,那么面临的问题就会复杂一些,
如是否需要对观察者的实例进行多线程保护等,这个得根据自己具体的设计测试一下效果。
4对期货加了时间的限制,没太理解如何加时间的限制,需要说明的具体点。
[ 本帖最后由 modern 于 2009-4-20 16:03 编辑 ]
回复 #4 modern 的帖子
谢谢~~~我回去好好看一下~~~
回复 #4 modern 的帖子
还想问一下,我的一个期货和一个观察者最初绑定后,
当第一次调用期货中的 call() 后,观察者是有响应的,
不过等一会儿再调用 call() 后,观察者就没有响应了。
这是为什么呀? 是不是我少做了什么操作呢?
期货中的 ACE_Future<char*> result_; 一直是一个成员变量。 下面是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;
} 谢,我回都研究一下~~~ 汗。。。期货是什么,英文是future么?
Future是干什么的,书上好像没有讲过啊? APG上面有。
页:
[1]
2