一个最简单的IOCP.

【以下仅仅是个人理解,不保证正确】
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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值