我們簡單的介紹了一下ace主動物件實現方式,同時提出了兩個問題:
方法呼叫執行緒如何知道該方法已經執行完成?
如何或得方法的返回值?
要解決這兩個問題,首先得介紹一下ace_future物件,ace_future是表示乙個會在將來被賦值的"**"物件,可以通過ready()函式查詢它是否已經被賦值。該物件建立的時候是未賦值的,後期可以通過set()函式來進行賦值,所賦的值可以通過get()函式來獲取。
下面**演示了它的基本用法:
1 #include "ace/future.h"2
3 #include
4 #include 5
using
namespace
std;67
void get_info(ace_future &fu)817
}1819int main(int argc, char *argv)
20
通過ace_future物件來解決上述兩個問題的方法如下:
使用的時候要注意一下ace_future物件的生命週期。
1 #include "ace/os.h
"2 #include "
ace/task.h
"3 #include "
ace/method_object.h
"4 #include "
ace/activation_queue.h
"5 #include "
ace/auto_ptr.h"6
7 #include "
ace/future.h"8
9 #include
10 #include 11
using
namespace
std;
1213
class logger: public ace_task14
2021
intsvc();
22string logmsg(const
string&msg);
23void logmsgactive (const
string& msg,ace_future *result);
2425
private
:26 ace_activation_queue cmdqueue; //
命令佇列
27};
2829
class logmsgcmd: public
ace_method_object
3038
39int
call()
4045
46private
:47 ace_future *result;
48 logger *log;
49string
msg;
50};
5152
string logger::logmsg(const
string&msg)
5358
59//
以主動的方式記錄日誌
60void logger::logmsgactive(const
string& msg,ace_future *result)
6165
66int
logger::svc()
6777
return0;
78}7980
void get_info(ace_future &fu)
8190}91
92int main (int argc, ace_tchar *argv)
93105
106 cout<"
cmd end
"<107108
while(true
)109 ace_os::sleep(1
);110
111return0;
112 }
**比較簡單,這裡就不多解釋了。
這種查詢模式比較簡單有效,但存在乙個問題:呼叫執行緒必須不斷輪詢ace_future物件以獲取返回值,這樣的效率比較低。可以通過觀察者模式解決這個問題:在ace_future物件上註冊乙個觀察者,當ace_future物件的值發生改變(非同步命令執行完成)時主動通知該觀察者,從而獲取返回值。
ace中的觀察者模式可以通過ace_future_observer來實現,使用方法如下:
1 #include "ace/future.h"2
3 #include
4 #include 5
using
namespace
std;67
class myobserver:public ace_future_observer815
};16
17int main(int argc, char *argv)
18
通過觀察者模式,可以更有效,及時的獲取非同步命令的返回值,但同時也增加了程式結構的複雜度並且難以除錯,使用的時候應該根據需要選取合適的方式。
ACE主動物件模式 2
方法呼叫執行緒如何知道該方法已經執行完成?如何或得方法的返回值?要解決這兩個問題,首先得介紹一下ace future物件,ace future是表示乙個會在將來被賦值的 物件,可以通過ready 函式查詢它是否已經被賦值。該物件建立的時候是未賦值的,後期可以通過set 函式來進行賦值,所賦的值可以通...
ACE主動物件模式 2
在上篇文章 裡,我們簡單的介紹了一下ace主動物件實現方式,同時提出了兩個問題 方法呼叫執行緒如何知道該方法已經執行完成?如何或得方法的返回值?要解決這兩個問題,首先得介紹一下ace future物件,ace future是表示乙個會在將來被賦值的 物件,可以通過ready 函式查詢它是否已經被賦值...
ACE主動物件模式 2
方法呼叫執行緒如何知道該方法已經執行完成?如何或得方法的返回值?要解決這兩個問題,首先得介紹一下ace future物件,ace future是表示乙個會在將來被賦值的 物件,可以通過ready 函式查詢它是否已經被賦值。該物件建立的時候是未賦值的,後期可以通過set 函式來進行賦值,所賦的值可以通...