现在的位置: 首页 > 综合 > 正文

IO Completion Port, demo code

2013年10月16日 ⁄ 综合 ⁄ 共 2121字 ⁄ 字号 评论关闭

#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");
   }
  }
 }
}

抱歉!评论已关闭.