IO异步机制
2014-08-07 10:14
92 查看
#include <iostream> #include <windows.h> #include <bitset> #include <vector> #include <assert.h> using namespace std; vector<string> pTempInfo; VOID WINAPI APC_A ( DWORD dwError, DWORD cbTransferred, LPOVERLAPPED lpo ) { pTempInfo.push_back ( "执行IO_A的完成例程" ) ; } VOID WINAPI APC_B ( DWORD dwError, DWORD cbTransferred, LPOVERLAPPED lpo ) { pTempInfo.push_back ( "执行IO_B的完成例程" ) ; } VOID WINAPI APC_C ( DWORD dwError, DWORD cbTransferred, LPOVERLAPPED lpo ) { pTempInfo.push_back ( "执行IO_C的完成例程" ) ; } void OnTest() { // APC测试 HANDLE hFile_A, hFile_B, hFile_C ; OVERLAPPED ov_A = {0}, ov_B = {0}, ov_C = {0} ; #define C_SIZE 1024 * 1024 * 32 string szText_A = "Sample A !" ; string szText_B = "Sampel B !" ; string szText_C ; szText_C.resize ( C_SIZE ) ; memset ( &(szText_C[0]), 0x40, C_SIZE ) ; pTempInfo.clear () ; hFile_A = CreateFileA ( "A.txt", GENERIC_WRITE, 0, NULL, \ CREATE_ALWAYS , FILE_FLAG_OVERLAPPED | FILE_FLAG_DELETE_ON_CLOSE, NULL ) ; hFile_B = CreateFileA ( "B.txt", GENERIC_WRITE, 0, NULL, \ CREATE_ALWAYS, FILE_FLAG_OVERLAPPED | FILE_FLAG_DELETE_ON_CLOSE, NULL ) ; hFile_C = CreateFileA ( "C.txt", GENERIC_WRITE, 0, NULL, \ CREATE_ALWAYS, FILE_FLAG_OVERLAPPED | FILE_FLAG_DELETE_ON_CLOSE, NULL ) ; WriteFileEx ( hFile_A, &(szText_A[0]), szText_A.length(), &ov_A, APC_A ) ; pTempInfo.push_back ( "启动IO_A, 并立即返回" ) ; WriteFileEx ( hFile_B, &(szText_B[0]), szText_B.length(), &ov_B, APC_B ) ; pTempInfo.push_back ( "启动IO_B, 并立即返回" ) ; WriteFileEx ( hFile_C, &(szText_C[0]), szText_C.size(), &ov_C, APC_C ) ; pTempInfo.push_back ( "启动IO_C, 并立即返回" ) ; pTempInfo.push_back ( "进入可变等待状态" ) ; SleepEx ( 1, true ) ; pTempInfo.push_back ( "结束可变等待状态" ) ; pTempInfo.push_back ( "进入可变等待状态" ) ; SleepEx ( 10000, true ) ; pTempInfo.push_back ( "结束可变等待状态" ) ; CloseHandle ( hFile_A ) ; CloseHandle ( hFile_B ) ; CloseHandle ( hFile_C ) ; vector<string>::iterator p ; for ( p = pTempInfo.begin(); p != pTempInfo.end(); p++ ) { cout << p->c_str() << "\n"; } } int main() { OnTest(); return 0; } #if 0 int main () { int a = 0; HANDLE hHnd = NULL; vector<string> vecOut; char *szTmp1 = new char[409600]; char *szTmp2 = new char[409600]; char *szTmp3 = new char[409600]; DWORD dwRet1 = 0; DWORD dwRet2 = 0; DWORD dwRet3 = 0; HANDLE hFile1 = CreateFileA("F:\\2.log", FILE_GENERIC_READ|FILE_SHARE_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, NULL); assert(INVALID_HANDLE_VALUE != hFile1); HANDLE hEvent1 = CreateEvent(NULL, FALSE, FALSE, NULL); HANDLE hEvent2 = CreateEvent(NULL, FALSE, FALSE, NULL); HANDLE hEvent3 = CreateEvent(NULL, FALSE, FALSE, NULL); OVERLAPPED ov1 = {0,}; OVERLAPPED ov2 = {0}; OVERLAPPED ov3 = {0}; ov1.hEvent = hEvent1; ov2.hEvent = hEvent2; ov2.hEvent = hEvent3; ov1.Offset = 8192; ov2.Offset = 4096; ov3.Offset = 2042; memset(szTmp1, 1, 409600); memset(szTmp2, 2, 409600); memset(szTmp3, 3, 409600); WriteFile(hFile1, szTmp1, 2048, &dwRet1, &ov1); WriteFile(hFile1, szTmp2, 1024, &dwRet2, &ov2); WriteFile(hFile1, szTmp3, 512, &dwRet3, &ov3); bool bOk = false; while(!bOk) { bOk = true; if(!GetOverlappedResult(hFile1, &ov1, &dwRet1, FALSE)) { bOk = false; } else { vecOut.push_back("1 over"); } if(!GetOverlappedResult(hFile1, &ov2, &dwRet2, FALSE)) { bOk = false; } else { vecOut.push_back("2 over"); } if(!GetOverlappedResult(hFile1, &ov3, &dwRet3, FALSE)) { bOk = false; } else { vecOut.push_back("3 over"); } } for (size_t i=0; i<vecOut.size(); i++) { cout << vecOut[i] << "\n"; } return 0; } #endif我是链接
相关文章推荐
- 异步机制 - IO完成端口
- linux设备驱动程序中的阻塞、IO多路复用与异步通知机制
- IO - 同步,异步,阻塞,非阻塞
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- 异步消息的传递-回调机制
- ios的notification机制是同步的还是异步的
- Java NIO 详解---NIO中的异步网络IO
- IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- android rxandroid异步消息处理机制
- IO - 同步,异步,阻塞,非阻塞【转】
- select(poll)效率,与异步网络IO,AIO, libevent, epoll
- Android Handler 异步消息处理机制的妙用 创建强大的图片加载类
- 利用bigpipe机制实现页面模块的异步渲染 chunked技术
- Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- javascript的闭包和异步机制
- Android异步机制AsyncTask的学习
- IO中同步、异步与阻塞、非阻塞的区别
- Unix中的IO模型:帮你弄清阻塞VS非阻塞、同步VS异步
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系