ACE主動物件模式 2

2021-07-10 08:54:29 字數 2547 閱讀 6374

我們簡單的介紹了一下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 函式來進行賦值,所賦的值可以通...