一边看《C++网络编程卷2》的ACE_Task一边做点笔记。
书上提到了个Active Object模式。ACE_Task启动了一组线程,它们共用一个线程函数,而在这个线程函数里,调用了ACE_Task::svc().代码很容易理解。网上找了个Active Object的定义:
1、构造一个命令(实现Command模式的一个命令)ACE中就是一个ACE_Message_Block
2、将该命令放入Active Object Engine(也就是一个队列) ,也就是ACE_Message_Queue
3、从Engine取出一个命令,执行若该名林更没有执行过,设为执行过,将自己放入队列尾部,若执行过,判断该命令执行需要的时间发生没有,未发生,再将自己加入队列尾部。事件发生了,将需要执行的命令加入队列尾部。
最后一点在ACE中不是,队列中的消息如何处理完全由ACE_Task::svc(),也就是我们自己处理。
另外书上P157的UML图中有个错误,ACE_Task和ACE_Thrad_Manager包含关系方向错了,
小四边形应该在ACE_Task这边,
以By Reference(这里是指针)方式包含0..1个ACE_Thrad_Manager.
使用方法也较为容易,我们自己重写ACE_Task::svc(),一般就是一个循环,
不停的取getq(),这个getq已经是互斥方法了,
然后将取得的ACE_Message_Block转化为当初存进去的类型,既然是Command模式
,存进去的应该是一个类(当然不是也没关系)。
再做处理即可。至于队列中的对象从哪里来,
书上自带的例子是一个从ACE_Event_Handler继承的子类,
在其handle_input中putq的,我们也可以在任意需要的地方加入。