【以下仅仅是个人理解,不保证正确】
IOCP有下面几个地方需要注意:
1.IOCP并不会自动为你创建工作线程,工作线程是你自己创建的,通过调用
GetQueuedCompletionStatus()函数使自己的线程等待IOCP的通知。
2.IOCP和异步读写是两码事,异步读写是异步读写,IOCP仅仅是让系统在完
成异步读写之后,唤醒你指定的线程罢了(从GetQueuedCompletionStatus
函数中返回)。
3.CreateIoCompletionPort()这个函数有两个功能,(1)、创建一个新的IOCP对
象。(2)、绑定一个设备和key(在工作线程中可以用来标识任务)到已存在的I-
OCP对象。
4.异步读写系统在帮你做的,自己完全不用写任何代码。只需要调用Read*,Wr-
IOCP有下面几个地方需要注意:
1.IOCP并不会自动为你创建工作线程,工作线程是你自己创建的,通过调用
GetQueuedCompletionStatus()函数使自己的线程等待IOCP的通知。
2.IOCP和异步读写是两码事,异步读写是异步读写,IOCP仅仅是让系统在完
成异步读写之后,唤醒你指定的线程罢了(从GetQueuedCompletionStatus
函数中返回)。
3.CreateIoCompletionPort()这个函数有两个功能,(1)、创建一个新的IOCP对
象。(2)、绑定一个设备和key(在工作线程中可以用来标识任务)到已存在的I-
OCP对象。
4.异步读写系统在帮你做的,自己完全不用写任何代码。只需要调用Read*,Wr-
ite*就可以了,在CreateFile的时候指定了异步读写的标志之后,这些函数就
自动会以异步的方式去工作了。
#include <Windows.h>
#include <tchar.h>
#include <exception>
#include <iostream>
#include <process.h>
using namespace std;
const DWORD READ_SIZE=1024*1024*1024;
DWORD realReadSize=0;
OVERLAPPED ov={0};
BYTE fileDataBuffer[READ_SIZE];
/**
worker线程。
*/
unsigned int WINAPI worker(LPVOID lpParam)
{
HANDLE hIOCP=(HANDLE)lpParam;
ULONG key=0;
DWORD numOfByteTransferred=0;
LPOVERLAPPED pOv=NULL;
while(GetQueuedCompletionStatus(hIOCP,&numOfByteTransferred,&key,&pOv,INFINITE))
{
cout<<"key="<<key<<".Read finished!"<<endl;
}
cout<<"Error!Error Code:"<<GetLastError()<<"."<<endl;
return 0;
}
int main()
{
HANDLE hFile=CreateFile(_T("test2.mkv"),GENERIC_WRITE|GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,
OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS|
FILE_FLAG_OVERLAPPED,NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
return 0;
}
ov.Offset=0;
HANDLE hIOCP=CreateIoCompletionPort(hFile,NULL,123456,4);
for(int i=0;i<4;i++)
{
_beginthreadex(NULL,0,worker,hIOCP,0,0);
}
ReadFile(hFile,fileDataBuffer,READ_SIZE,&realReadSize,&ov);
int i=0;
while(1)
{
cout<<"a";
i++;
if(i>100)
break;
}
getchar();
CloseHandle(hFile);
return 0;
}