在上篇文章
裡,我們簡單的介紹了一下ace主動物件實現方式,同時提出了兩個問題:
方法呼叫執行緒如何知道該方法已經執行完成?
如何或得方法的返回值?
要解決這兩個問題,首先得介紹一下ace_future物件,ace_future是表示乙個會在將來被賦值的"**"物件,可以通過ready()函式查詢它是否已經被賦值。該物件建立的時候是未賦值的,後期可以通過set()函式來進行賦值,所賦的值可以通過get()函式來獲取。
下面**演示了它的基本用法:
#include
"ace/future.h"
#include
#include
using
namespace std;
void get_info(ace_future&fu)
通過ace_future物件來解決上述兩個問題的方法如下:
使用的時候要注意一下ace_future物件的生命週期。
為了演示了如何獲取主動命令的執行狀態和結果,我將上篇文章中的**改動了一下,日誌類記錄日誌後,會將記錄的內容作為返回值返回,該返回值會通過ace_future物件返回,**如下:
#include
"ace/os.h"
#include
"ace/task.h"
#include
"ace/method_object.h"
#include
"ace/activation_queue.h"
#include
"ace/auto_ptr.h"
#include
"ace/future.h"
#include
#include
using
namespace std;
class logger: public ace_task
int svc();
string logmsg(const string& msg);
void logmsgactive (const string& msg,ace_future*result);
private:
ace_activation_queue cmdqueue; //命令佇列
};class logmsgcmd: public ace_method_object
int call()
private:
ace_future*result;
logger *log;
string msg;
};string logger::logmsg(const string& msg)
//以主動的方式記錄日誌
void logger::logmsgactive(const string& msg,ace_future*result)
int logger::svc()
return 0;
}void get_info(ace_future&fu)
cout<"cmd end"
ace_os::sleep(1);
return 0;}
**比較簡單,這裡就不多解釋了。
這種查詢模式比較簡單有效,但存在乙個問題:呼叫執行緒必須不斷輪詢ace_future物件以獲取返回值,這樣的效率比較低。可以通過觀察者模式解決這個問題:在ace_future物件上註冊乙個觀察者,當ace_future物件的值發生改變(非同步命令執行完成)時主動通知該觀察者,從而獲取返回值。
ace中的觀察者模式可以通過ace_future_observer來實現,使用方法如下:
#include
"ace/future.h"
#include
#include
using
namespace std;
class myobserver:public ace_future_observer
通過觀察者模式,可以更有效,及時的獲取非同步命令的返回值,但同時也增加了程式結構的複雜度並且難以除錯,使用的時候應該根據需要選取合適的方式。
ACE主動物件模式 2
方法呼叫執行緒如何知道該方法已經執行完成?如何或得方法的返回值?要解決這兩個問題,首先得介紹一下ace future物件,ace future是表示乙個會在將來被賦值的 物件,可以通過ready 函式查詢它是否已經被賦值。該物件建立的時候是未賦值的,後期可以通過set 函式來進行賦值,所賦的值可以通...
ACE主動物件模式 2
我們簡單的介紹了一下ace主動物件實現方式,同時提出了兩個問題 方法呼叫執行緒如何知道該方法已經執行完成?如何或得方法的返回值?要解決這兩個問題,首先得介紹一下ace future物件,ace future是表示乙個會在將來被賦值的 物件,可以通過ready 函式查詢它是否已經被賦值。該物件建立的時...
ACE主動物件模式 2
方法呼叫執行緒如何知道該方法已經執行完成?如何或得方法的返回值?要解決這兩個問題,首先得介紹一下ace future物件,ace future是表示乙個會在將來被賦值的 物件,可以通過ready 函式查詢它是否已經被賦值。該物件建立的時候是未賦值的,後期可以通過set 函式來進行賦值,所賦的值可以通...