這篇文章是繼承上篇《windows 同步裝置 i/o 與非同步裝置 i/o》,未讀過的讀者可以去看看再來看這篇文章哈。建立新的i/o完成埠
i/o完成可能是最複雜的windows核心物件了,為了建立乙個i/o完成端**們需要呼叫createiocompletionport函式:
handle winapi createiocompletionport(
_in_ handle filehandle,
_in_opt_ handle existingcompletionport,
_in_ ulong_ptr completionkey,
_in_ dword numberofconcurrentthreads
);
這個函式執行兩項不同的任務:它不僅會建立乙個i/o完成埠,而且會將乙個裝置與乙個i/o完成埠關聯起來。為了只建立乙個i/o完成端**們可以對上面的函式進行封裝:
handle createnewcompletionport(dword threadsize)
這個函式只有乙個引數threadsize,它呼叫了createiocompletionport來建立乙個新i/o完成埠。為了只建立乙個i/o完成埠前三個引數傳入固定值invalid_handle_value, null和0,第四個引數告訴i/o完成端在統一時間最多有多少執行緒處於可執行的狀態。如果threadsize傳入0,那麼i/o埠會使用預設值也就是cpu數量。這個通常也是我們想要的。
將裝置和i/o完成埠關聯
當我們建立乙個i/o完成埠的時候,系統核心實際上會建立5個不同的資料結構。
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-f**3urmz-1607852667079)(
我們封裝乙個函式將i/o完成埠和裝置關聯:
bool devicewithcopletionport(handle hcompletionport, handle hdevice, dword dwcompletionkey)
hcompletionport 為createnewcompletionport建立完成埠的控制代碼、hdevice為裝置控制代碼、dwcompletionkey 為完成鍵當i/o完成時會返回我們設定的dwcompletionkey的值。這個值作業系統並不關心但是我們自己需要關心。
如何使執行緒等待i/o完成通知
執行緒通過呼叫getqueuedcompletionstatus可以將自己切換到睡眠狀態,來等待裝置i/o請求完成並進入完成埠。
bool getqueuedcompletionstatus(
handle completionport,
lpdword lpnumberofbytestransferred,
pulong_ptr lpcompletionkey,
dword dwmilliseconds
);
直接上**
//新建工程iocomplet工程, 拷貝**到main.cpp
#include #include #include #define vioserial_port_path l"e:\\code\\iocomplet\\debug\\iocomplet1.pdb"
#define max_size 20
char buf[max_size];
handle hport;
handle h;
handle createnewcompletionport(dword threadsize)
bool devicewithcopletionport(handle hcompletionport, handle hdevice, dword dwcompletionkey)
enum iotype
m_iotype;
};void func()}}
} printf("end\n");
} printf("end end\n");
}int main()
else
std::thread proc(func);
proc.detach();
sleep(1000);
myio myio;
myio.hevent = null;
myio.internal = 0;
myio.internalhigh = 0;
myio.offset = 0;
myio.offsethigh = 0;
myio.m_iotype = myio::iotype::io_read;
dword readsize;
bool retr = readfile(h, buf, max_size, &readsize, &myio);
if (retr == false)
}} sleepex(infinite, false);
return 0;
}
完成埠實現echo tcp server
include stdio.h include winsock2.h pragma comment lib,ws2 32.lib define port 5150 define data bufsize 8192 typedef struct char buffer data bufsize int...
設定 i o port I O 完成埠實現
這篇文章是繼承上篇 windows 同步裝置 i o 與非同步裝置 i o 未讀過的讀者可以去看看再來看這篇文章哈。建立新的i o完成埠 i o完成可能是最複雜的windows核心物件了,為了建立乙個i o完成端 們需要呼叫createiocompletionport函式 handle winapi...
用IO完成埠實現管道非同步服務端
windows程式設計中,如果涉及到本地兩個程序之間的通訊,最好的方式就是管道,管道支援同步和非同步兩種模式,作為服務端,當然用非同步好,本文章直接提供用io完成埠實現管道服務端的 include stdafx.h include lptstr lpszpipename text pipe pipe...