ACE中使用完成埠

2021-04-26 20:26:36 字數 4579 閱讀 5124

使用ace中的proactor的話,會要比我們使用我們直接寫的要來得簡單。

在說proactor之前我們需要了解windows裡的完成埠的工作原理。

完成埠是winnt核心裡的乙個框架。我們可以為我們的一些非同步的操作

新建乙個完成埠,然後這個完成埠會有幾個工作執行緒來處理。我們

可以將socket,或是乙個檔案讀寫,或是乙個串列埠的收發資料的控制代碼,

梆定到這個完成埠之上,當乙個讀或是寫的事件完成之後,完成埠

機制將會自動將乙個完成訊息放到完成佇列中,完成埠的工作執行緒池

將會被觸發呼叫。**的時候我們梆定時將一些基礎的資訊也梆在其中,

當工作執行緒也會通過一種叫做完成項的指標返回給你。就是說,你可能

梆定了多個socket或是檔案都是沒有問題的。按微軟人寫的文件裡說的

可以面對百萬個這樣的非同步物件。

這裡我就不再使用winapi寫完成埠了。

現在是使用ace框架來寫乙個。

使用他來做乙個完成埠步驟也是一樣的。

開始的時候需要乙個完成埠,還有完成埠的工作執行緒池。在ace框架

裡提供了一種叫ace_task的執行緒池模組類

和一般的執行緒類一樣,它的工作時呼叫的函式是

virtual int svc (void);

只是如何使用呢。無非是開啟執行緒與關閉執行緒兩個操作。

在此類中定義乙個ace_thread_semaphore sem_;變數

然後開戶n個執行緒的過程就是這樣的:

int proactor_task::star(int nmax)

return 0;

}乙個是建立,二個是乙個乙個的觸發。讓這一些執行緒都工作.

當然工作執行緒都要釋放自己:

int proactor_task::svc()

好了。這個執行緒池開始工作了。接下來,我們要做將完成埠物件給建立出來:

在這個執行緒池裡定義乙個完成埠物件指標:

ace_proactor * proactor_;

建立的過程是這樣的。

//是在win32下,就使用這個proactor的實現

ace_win32_proactor *proactor_impl = new ace_win32_proactor(); //新建proactor的實現

proactor_=new ace_proactor(proactor_impl,1); //與proactor關聯

ace_proactor::instance (this->proactor_, 1); //將新建出來的proactor儲存在靜態框架裡

如何刪除呢。

ace_proactor::end_event_loop();

this->wait();

之後來寫執行緒池裡的函式

ace_proactor::run_event_loop();

只要寫一句就ok了。

這就完成了乙個完成埠物件的建立過程。我們只要做一下封裝就ok了。

給它乙個工作執行緒的大小。之後它就會自動的新建乙個完成埠在ace_proactor::instance裡。

// accepte.h: inte***ce for the accepte class.

////

#if !defined(afx_accepte_h__dcec809d_e5d2_48d1_a8a7_c9fd3c4d7c15__included_)

#define afx_accepte_h__dcec809d_e5d2_48d1_a8a7_c9fd3c4d7c15__included_

#if _msc_ver > 1000

#pragma once

#endif // _msc_ver > 1000

#include

#include "receive.h"

class accepte : public ace_asynch_acceptor

// proactor_task.h: inte***ce for the proactor_task class.

////

#if !defined(afx_proactor_task_h__12f37c95_9872_4923_89a2_5a59ae7ac1fd__included_)

#define afx_proactor_task_h__12f37c95_9872_4923_89a2_5a59ae7ac1fd__included_

#if _msc_ver > 1000

#pragma once

#endif // _msc_ver > 1000

#include "ace/task_t.h"

#include "ace/thread_semaphore.h"

#include "ace/proactor.h"

#include "ace/win32_proactor.h"

class proactor_task : public ace_task

;#endif // !defined(afx_proactor_task_h__12f37c95_9872_4923_89a2_5a59ae7ac1fd__included_)

// proactor_task.cpp: implementation of the proactor_task class.

////

#include "proactor_task.h"

//// construction/destruction

//proactor_task::proactor_task()

return 0;

}int proactor_task::stop()

int proactor_task::release_proactor()

int proactor_task::create_proactor()

int proactor_task::svc()

// receive.h: inte***ce for the receive class.

////

#if !defined(afx_receive_h__0e7ef8c0_465f_4d9c_8a29_0c2a0f1eaffe__included_)

#define afx_receive_h__0e7ef8c0_465f_4d9c_8a29_0c2a0f1eaffe__included_

#if _msc_ver > 1000

#pragma once

#endif // _msc_ver > 1000

#include

#include

#include

#include

class receive : public ace_service_handler

}virtual void open(ace_handle h,ace_message_block& );

virtual void handle_read_stream(const ace_asynch_read_stream::result &result);

virtual void handle_write_stream(const ace_asynch_write_stream::result &result);

private:

ace_asynch_write_stream write_;

ace_asynch_read_stream reader_;

#endif // !defined(afx_receive_h__0e7ef8c0_465f_4d9c_8a29_0c2a0f1eaffe__included_)

// receive.cpp: implementation of the receive class.

////

#include "receive.h"

//// construction/destruction

//receive::receive()

void receive::open(ace_handle h,ace_message_block& )

ace_message_block *mb;

ace_new_noreturn(mb,ace_message_block(1024));

if ( this->reader_.read(*mb,mb->space()) != 0)

}void receive::handle_read_stream (const ace_asynch_read_stream::result &result)

else

return ;

}void receive::handle_write_stream (const ace_asynch_write_stream::result &result)

//main.cpp

#ifdef _debug

#pragma comment(lib,"aced")

#else

#pragma comment(lib,"ace")

#endif

#include

#include "accepte.h"

#include "proactor_task.h"

int ace_tmain(int ,char*)

用完成埠寫的echo server

完成埠網上的例子很多,但覺得都挺複雜的 寫了乙個簡化版的,方便學習,也加了注釋。有任何問題,歡迎跟我討論。來了 include winsock2.h include mswsock.h include windows.h include iostream using namespace std in...

使用完成埠框架開發非同步模組

static handle g hiocp static dword winapi worker lpvoid pvd static const int buf len 256 struct myperiodata int tmain int argc,tchar argv printf s n p...

ACE 實現 完成埠 win32 I O模型

在win32平台上最有效率的io模型,莫過於完成埠了。csdn上到處都是關於完成埠的問題。在ace中對win32平台的完成埠有著非常好的封裝。ace中前攝式框架的win32實現就是使用的完成埠。我們先來看看這個框架有哪些組成部分。ace proactor 前攝器,真怪異的名字。叫非同步事件分配者多好...