日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ACE_Task介绍

發布時間:2025/4/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ACE_Task介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ACE_Task 是ACE 中的任務或主動對象“處理結構”的基類。在ACE 中使用了此類來實現主動對象模式。所有希望成為“主動對象”的對象都必須從此類派生。你也可以把ACE_Task看作是更高級的、更為面向對象的線程類。相當于我們具體業務是繼承ACE_Task這個類進行實現的。

ACE_Task處理的是對象,因而在構造OO程序時更便于思考。因此,在大多數情況下,當你需要構建多線程程序時,較好的選擇是使用ACE_Task 的子類。這樣做有若干好處。首要的是剛剛所提到的,這可以產生更好的OO軟件。其次,你不必操心你的線程入口是否是靜態的,因為ACE_Task 的入口是一個常規的成員函數。而且,我們會看到ACE_Task 還包括了一種用于與其他任務進行通信的易于使用的機制。

要創建任務,需要進行以下步驟:

  • 實現服務初始化和終止方法:
    open()方法應該包含所有專屬于任務的初始化代碼。其中可能包括諸如連接控制塊、鎖和內存這樣的資源。close()方法是相應的終止方法。
  • 調用啟用(Activation)方法:
    在主動對象實例化后,你必須通過調用activate()啟用它。要在主動對象中創建的線程的數目,以及其他一些參數,被傳遞給activate()方法。activate()方法會使svc()方法成為所有它生成的線程的啟動點。
  • 實現服務專有的處理方法:
    如上面所提到的,在主動對象被啟用后,各個新線程在svc()方法中啟動。應用開發者必須在子類中定義此方法。
  • ACE 中的每個任務都有一個底層消息隊列(ACE_Message_Block),這個消息隊列被用作任務間通信的一種方法。當一個任務想要與另一任務“談話”時,它創建一個消息,并將此消息放入它想要與之談話的任務的消息隊列使用putq方法。接收任務通常用getq () 從消息隊列里獲取消息。如果隊列中沒有數據可用,它就進入休眠狀態。如果有其他任務將消息插入它的隊列,它就會蘇醒過來,從隊列中拾取數據并處理它。因而,在這種情況下,接收任務將從發送任務那里接收消息,并以應用特定的方式作出反饋。

    putq()?方法

    將消息插入到另一任務的消息隊列中

    getq()方法

    將消息提取出來

    這樣的體系結構大大簡化了多線程程序的編程模型

    下一個例子演示兩個任務怎樣使用它們的底層消息隊列進行通信。這個例子包含了經典的生產者-消費者問題的實現。生產者任務生成數據,將它發送給消費者任務。消費者任務隨后消費這個數據。使用ACE_Task 構造,我們可將生產者和消費者看作是不同的ACE_Task 類型的對象。這兩種任務使用底層消息隊列進行通信。

    生產者消費者實例1:生產者和消費者共享同一個內部消息隊列
    消費者實現,主要是任務的接受數據進行處理,svc函數表示線程的啟動的入口,putq方法傳輸進來的底層數據。 #include "ace/Task.h"class ProduceAudio : public ACE_Task<ACE_MT_SYNCH> { public:ProduceAudio(ACE_Thread_Manager *thr_man=0,ACE_Message_Queue<ACE_MT_SYNCH> *mq=0);~ProduceAudio(void);int open(void*);int svc(void); }; #include "ProduceAudio.h"#include "ace/Log_Msg.h" #include "ace/OS.h" #include "Converter.h" #include <string> using namespace std;ProduceAudio::ProduceAudio(ACE_Thread_Manager *thr_man,ACE_Message_Queue<ACE_MT_SYNCH> *mq):ACE_Task<ACE_MT_SYNCH>(thr_man,mq) { }ProduceAudio::~ProduceAudio(void) {ACE_DEBUG((LM_DEBUG, "(%t) ~ProduceAudio()\n")); }int ProduceAudio::open(void*) { ACE_DEBUG((LM_DEBUG, "(%t) ProduceAudio task opened\n")); activate(THR_NEW_LWP,1); return 0; } int ProduceAudio::svc(void) {ACE_DEBUG((LM_DEBUG, "(%t) ProduceAudio::svc() running\n")); string s("message");for ( int i=0;i<3;++i){ACE_Message_Block * blk = new ACE_Message_Block(10);blk->copy( (s + lexical_cast<string>(i)).c_str());this->putq(blk);//this->put(blk);ACE_DEBUG((LM_DEBUG, "(%t) ProduceAudio::svc() put(%s),now msg_queue()->message_count()[%d]\n",blk->rd_ptr(),this->msg_queue()->message_count())); ACE_OS::sleep(1);}ACE_DEBUG((LM_DEBUG, "(%t) ProduceAudio::svc() return\n")); return 0; }

    消費者類 獲取從其他線程putq傳送過來的底層數據,就是不同線程間的通信

    #include "ace/Task.h"class SendToServer : public ACE_Task<ACE_MT_SYNCH> { public:SendToServer(ACE_Thread_Manager *thr_man=0,ACE_Message_Queue<ACE_MT_SYNCH> *mq=0);~SendToServer(void);int open(void*);int svc(void); };
    #include "SendToServer.h"#include "ace/OS.h" #include <string> using namespace std;SendToServer::SendToServer(ACE_Thread_Manager *thr_man,ACE_Message_Queue<ACE_MT_SYNCH> *mq):ACE_Task<ACE_MT_SYNCH>(thr_man,mq) { }SendToServer::~SendToServer(void) {ACE_DEBUG((LM_DEBUG, "(%t) ~SendToServer()\n")); }int SendToServer::open(void*) { ACE_DEBUG((LM_DEBUG, "(%t) SendToServer task opened\n")); activate(THR_NEW_LWP,1); return 0; } int SendToServer::svc(void) {ACE_DEBUG((LM_DEBUG, "(%t) SendToServer::svc() running\n")); ACE_Message_Block * blk = NULL;int count =0;for ( ; count<3;){if (this->msg_queue()->message_count()>0){this->getq(blk);++count;ACE_DEBUG((LM_DEBUG,"SendToServer get :%s\n",blk->rd_ptr()));blk->release();}ACE_OS::sleep(1);}ACE_DEBUG((LM_DEBUG, "(%t) SendToServer::svc() return\n")); return 0; }main函數
    #include "ace/Thread_Manager.h" #include "SendToServer.h" #include "ProduceAudio.h"#ifdef _DEBUG #pragma comment (lib,"ACEd.lib") #else #pragma comment (lib,"ACE.lib") #endif int main(int argc, char* argv[]) {SendToServer consumer(NULL,NULL);ProduceAudio producer(NULL,consumer.msg_queue());producer.open(NULL);consumer.open(NULL);ACE_Thread_Manager::instance()->wait();return 0; }

    總結

    以上是生活随笔為你收集整理的ACE_Task介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 色涩久久| 久色视频在线播放 | 国产精品久久免费视频 | www狠狠| 大香伊人中文字幕精品 | 午夜影院在线观看18 | 欧美视频自拍偷拍 | 国产日产精品一区二区 | 殴美一级特黄aaaaaa | 黄色3级视频 | 欧美日韩免费一区二区三区 | 色哟哟国产精品 | 欧美偷拍第一页 | 亚洲第七页 | 中文字幕日韩三级 | 免费荫蒂添的好舒服视频 | av噜噜噜| 亚洲一区二区久久 | 免费黄视频网站 | 可以在线观看的黄色 | 色婷婷av一区二区三区之e本道 | 人妻丰满熟妇av无码久久洗澡 | 2023av在线| 国产精品蜜臀 | 国产精品丝袜 | 一边摸一边抽搐一进一出视频 | 国产av精国产传媒 | 妺妺窝人体色www聚色窝仙踪 | 超碰女| 国产黄色网址在线观看 | 色葡萄影院 | 国产女人18毛片水真多18 | 免费在线一区二区三区 | 91看片淫黄大片91桃色 | 日本久久亚洲 | 久久午夜精品 | 国产精品视频不卡 | 亚洲视频在线看 | 国内自拍欧美 | 二区三区偷拍浴室洗澡视频 | 成人在线免费观看网址 | 不卡av免费在线观看 | 特大黑人巨交吊性xxxx视频 | 极品探花在线播放 | 欧美精品videos另类日本 | 成人网址在线观看 | 重口变态虐黄网站 | 黄色片网站在线免费观看 | 里番acg★同人里番本子大全 | 亚洲成人aa| 国产小视频在线观看 | 日韩电影在线观看一区二区 | 国产一区二区三区播放 | 亚洲成人91 | 国产精品1 | 韩国三级在线视频 | 综合在线视频 | 日韩亚洲欧美在线 | 亚洲无码精品在线观看 | 能看av的网站 | 91福利一区二区 | 国产无遮挡又黄又爽在线观看 | 国产xxxxxxxxx| 中文字幕日韩经典 | 91无毒不卡 | 一级理论片| 国产精品av在线免费观看 | 国产又粗又长又大 | 国产精品av一区二区 | 打屁股疼的撕心裂肺的视频 | 涩涩屋污 | 亚洲综合p | 午夜日韩在线观看 | 香蕉视频国产 | 国产又粗又长又黄视频 | 三级黄色在线播放 | 欧美一区二区三区不卡视频 | 国产男女猛烈无遮挡免费观看网站 | 壮汉被书生c到合不拢腿 | 国产午夜成人久久无码一区二区 | 九九精品在线观看视频 | 亚洲高清毛片一区二区 | 一区二区三区不卡视频 | 荫蒂被男人添免费视频 | 99精品视频免费 | 国产美女黄色片 | 国产精品一区二区无码免费看片 | 欧美激情视频在线观看 | 色综合图片 | 麻豆做爰免费观看 | 久久久久久成人精品 | 综合另类 | 久久9精品区-无套内射无码 | 国产精品一级 | 懂色aⅴ国产一区二区三区 亚洲欧美国产另类 | 日本精品成人 | 精品人妻伦一二三区久 | 丰满肉嫩西川结衣av | 学生孕妇videosex性欧美 |