ACE主動物件模式 2

2021-04-26 20:24:27 字數 1961 閱讀 4929

方法呼叫執行緒如何知道該方法已經執行完成? 

如何或得方法的返回值?

要解決這兩個問題,首先得介紹一下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主動物件實現方式,同時提出了兩個問題 方法呼叫執行緒如何知道該方法已經執行完成?如何或得方法的返回值?要解決這兩個問題,首先得介紹一下ace future物件,ace future是表示乙個會在將來被賦值的 物件,可以通過ready 函式查詢它是否已經被賦值...

ACE主動物件模式 2

我們簡單的介紹了一下ace主動物件實現方式,同時提出了兩個問題 方法呼叫執行緒如何知道該方法已經執行完成?如何或得方法的返回值?要解決這兩個問題,首先得介紹一下ace future物件,ace future是表示乙個會在將來被賦值的 物件,可以通過ready 函式查詢它是否已經被賦值。該物件建立的時...

ACE主動物件模式 2

方法呼叫執行緒如何知道該方法已經執行完成?如何或得方法的返回值?要解決這兩個問題,首先得介紹一下ace future物件,ace future是表示乙個會在將來被賦值的 物件,可以通過ready 函式查詢它是否已經被賦值。該物件建立的時候是未賦值的,後期可以通過set 函式來進行賦值,所賦的值可以通...