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 }
4.结果
1 $ ./tt 2 hello 3 book 4 hello 5 book 6 hello 7 book 8 hello 9 book
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。