转载于:http://www.cnblogs.com/TianFang/archive/2006/12/05/583231.html

我们在前一章中使用ACE_Thread包装时,你一定已经注意到了一些不够"优雅"的地方。那一章中的大多数程序都被分解为函数、而不是对象。这是因为ACE_Thread包装需要一个全局函数名、或是静态方法作为参数。随后该函数(静态方法)就被用作所派生的线程的"启动点"。这自然就使得程序员要为每个线程写一个函数。如我们已经看到的,这可能会导致非面向对象的程序分解。

ACE_Task对常用线程处理进行了OO包装,通过ACE_Task,能对线程进行更好的操作。

要创建任务,需要进行以下步骤:

  1. 实现服务初始化和终止方法:
    open()方法应该包含所有专属于任务的初始化代码。其中可能包括诸如连接控制块、锁和内存这样的资源。close()方法是相应的终止方法。
  2. 调用启用(Activation)方法:
    在主动对象实例化后,你必须通过调用activate()启用它。要在主动对象中创建的线程的数目,以及其他一些参数,被传递给activate()方法。activate()方法会使svc()方法成为所有它生成的线程的启动点。
  3. 实现服务专有的处理方法:
    如上面所提到的,在主动对象被启用后,各个新线程在svc()方法中启动。应用开发者必须在子类中定义此方法。

下面的例子演示怎样去创建任务:

#include "ace/Task.h"
#include "ace/OS.h"

#include <iostream>
using namespace std;

class TaskThread: public ACE_Task<ACE_MT_SYNCH>
{
public:
    virtual int svc(void)
    {
        for(int i=0;i<10;i++)
        {
            ACE_OS::sleep(1);
            cout<<endl<<"hello thread1"<<endl;
        }
        return 0;
    }
};

int main(int argc, char *argv[]) 

    TaskThread task;
    task.activate();
    
    while(true)
        ACE_OS::sleep(10);

return 0; 
}

ACE_Task也封装了常用线程操作,如暂停,恢复及停止等,是不是非常简单和方便呢。

其实ACE_Task的使用还不仅仅是这些,通过它还可实现一种很常用的网络编程模式--主动对象模式,其具体功能在后续的设计模式部分将作详细的介绍。

最新文章

  1. ubuntu14.04下安装node.js
  2. 2017 苹果强制https
  3. C++学习笔记 宏 const 内联 枚举
  4. application
  5. MYSQL57密码策略修改
  6. java代写
  7. vs智能提示突然消失的解决办法 (vs2008 vs2010 vs2012 智能提示)
  8. spring security 构造函数初始化bean思路
  9. 例子: 自制Flask首页导航.
  10. # void :;
  11. 使用 Http 的 Post 方式与网络交互通信
  12. 原生js代码挑战之动态添加双色球
  13. 使用 Android 的日志工具LogCat
  14. 170503、centos6.5安装mysql5.6.30
  15. Python之简单函数练习(Day30)
  16. python入门基本知识
  17. Pytest+allure+jenkins生成测试报告
  18. EasyPlayerPro Windows播放器读取xml配置文件中的特殊字符问题
  19. 设计模式(二 &amp; 三)工厂模式:概述
  20. 树莓派 - 蓝牙 (1) 试试Beacon

热门文章

  1. Js全反选DataGrid
  2. 2018java开发一些面经
  3. java DTO 转 POJO
  4. sql 至少含有
  5. C语言 命令行参数 函数指针 gdb调试
  6. Java之I/O流(第1部分)
  7. &lt;Android&gt;菜单资源的使用
  8. fcntl函数详解
  9. 【EF】EF扩展库(批量操作)
  10. BZOJ4804 欧拉心算(莫比乌斯反演+欧拉函数+线性筛)