使用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 前攝器,真怪異的名字。叫非同步事件分配者多好...