ACE_linux:任务 & 命令(Task and Command)

1.涉及类

ACE_Task//ACE任务
ACE_Activation_Queue//ACE命令队列

ACE_Method_Request//ACE请求(命令)

2.简介

ACE主动对象模式

主动对象模式用于降低方法执行和方法调用之间的耦合。该模式描述了另外一种更为透明的任务间通信方法。

传统上,所有的对象都是被动的代码段,对象中的代码是在对它发出方法调用的线程中执行的,当方法被调用时,调用线程将阻塞,直至调用结束。而主动对象却不一样。这些对象具有自己的命令执行线程,主动对象的方法将在自己的执行线程中执行,不会阻塞调用方法。

3.代码示例

技术分享
 1 #include "ace/Task.h"
 2 #include "ace/Method_Request.h"
 3 #include "ace/Activation_Queue.h"
 4 #include <iostream>
 5 using namespace std;
 6 
 7 class Logger: public ACE_Task<ACE_MT_SYNCH>
 8 {
 9 public:
10     Logger() {}
11     int svc();
12     void LogMsg(const string& msg);
13     void LogMsgActive (const string& msg);
14 private:
15     ACE_Activation_Queue cmdQueue;    //命令队列
16 };
17 class LogMsgCmd: public ACE_Method_Request
18 {
19 public:
20     LogMsgCmd(Logger *log,const string& msg)
21     {
22         this->log=log;
23         this->msg=msg;
24     }
25     virtual int call()
26     {
27         log->LogMsg(msg);
28         return 0;
29     }
30 private:
31     Logger *log;
32     string msg;
33 };
34 void Logger::LogMsg(const string& msg)
35 {
36     cout<<msg<<endl;
37 }
38 //以主动的方式记录日志
39 void Logger::LogMsgActive(const string& msg)
40 {
41     //生成命令对象,插入到命令队列中
42     cmdQueue.enqueue(new LogMsgCmd(this,msg));   //enqueue  入队列
43 }
44 int Logger::svc()
45 {
46     while(true)
47     {
48         //遍历命令队列,执行命令(auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理)
49         auto_ptr<ACE_Method_Request> pMsgCmd(cmdQueue.dequeue ());  //dequeue 出队列
50         pMsgCmd->call();
51     }
52     return 0;
53 }
54 int main (int argc, ACE_TCHAR *argv[])
55 {
56     Logger log;
57     log.activate();
58 
59     for(int i=0;i<4;i++)
60     {
61         log. LogMsgActive ("hello");
62         ACE_OS::sleep(1);
63         log.LogMsgActive("book");
64         ACE_OS::sleep(1);
65     }
66 
67     log.wait();
68     return 0;
69 }
Logger.cpp

4.结果

技术分享
1 $ ./tt
2 hello
3 book
4 hello
5 book
6 hello
7 book
8 hello
9 book
View Code

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。