#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <process.h>
typedef struct _PER_HANDLE_DATA
{
char *szstrFileName;
}PER_HANDLE_DATA, *PPER_HANDLE_DATA;
typedef struct _PER_IO_DATA
{
OVERLAPPED overlapped;
int nOperationTeyp;
char buf[1024];
#define OP_READ 1
#define OP_WRITE 2
}PER_IO_DATA, *PPER_IO_DATA;
HANDLE hIocp;
HANDLE hFile;
PPER_IO_DATA pIoData = NULL;
void CheckIocp(void*);
void ReadIt(void*);
int _tmain(int argc, _TCHAR* argv[])
{
//Set ThreadNumber
hIocp = CreateIoCompletionPort(NULL, NULL, NULL, 0);
hFile = CreateFile(TEXT("c://test.txt"),
GENERIC_READ,
FILE_SHARE_WRITE|FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, //FILE_FLAG_OVERLAPPED required
NULL);
PER_HANDLE_DATA perHandleData;
perHandleData.szstrFileName = "test.txt";
//Associate IOCP and File
hIocp = CreateIoCompletionPort(hFile, hIocp, (DWORD)&perHandleData, 0);
_beginthread(CheckIocp, 0, NULL);
_beginthread(ReadIt, 0, NULL);
while(true)
{
Sleep(1000);
}
CloseHandle(hIocp);
CloseHandle(hFile);
return 0;
}
//
void ReadIt(void *dumy)
{
while(true)
{
if(pIoData == NULL)
{
pIoData = (PPER_IO_DATA)malloc(sizeof(PPER_IO_DATA));
}
memset(&pIoData->overlapped, 0, sizeof(pIoData->overlapped));
char *buf = pIoData->buf;
DWORD dwBytesRead;
pIoData->nOperationTeyp = OP_READ;
//Read to OVERLAPPED from file
bool bRe = ReadFile(hFile, buf, 5, &dwBytesRead, &pIoData->overlapped);
if(bRe)
{
printf("read it, set singal to overlapped/r/n");
}
int nRand = rand()%3;
Sleep(nRand*1000);
}
}
void CheckIocp(void *dumy)
{
while(true)
{
LPDWORD lpNumberOfBytes;
DWORD nBytes;
lpNumberOfBytes = &nBytes;
PULONG_PTR lpCompletionKey;
PPER_HANDLE_DATA pPerHandleData;
printf("waiting singal/r/n");
PPER_IO_DATA pPerIo;
//Wake up when read data from IOCP
bool bRe = GetQueuedCompletionStatus(hIocp, lpNumberOfBytes, (LPDWORD)&pPerHandleData, (LPOVERLAPPED*)&pPerIo, INFINITE);
if(bRe)
{
char *szstr = pPerHandleData->szstrFileName;
printf("get %d %s ", *lpNumberOfBytes, szstr);
pPerIo->buf[*lpNumberOfBytes] = 0;
if(pPerIo->nOperationTeyp == OP_READ)
{
printf("read out: %s /r/n", pPerIo->buf);
}
if(pPerIo->nOperationTeyp == OP_WRITE)
{
printf("write /r/n");
}
}
}
}