我写了一个小程序,用BindIoCompletionCallback注册回调函数,程序先写入文件,然后在异步Io回调函数里面去Read.运行的结果是回调函数不停的运行了1s钟(因为我SleepEx了1s钟).这是为什么呢?
#include"stdafx.h"
#include<windows.h>
#include<stdio.h>
#include<tchar.h>
HANDLE hFile,hIocp;
DWORD dwr,dww;
OVERLAPPED overlap={0};
char content[10]={0};
VOID CALLBACK f(DWORD dwErrorCode,DWORD,LPOVERLAPPED){
WaitForSingleObject(hFile,INFINITE);
ReadFile(hFile,content,10,&dwr,&overlap);
printf("读取内容=%s\n",content);
}
int _tmain(int argc, _TCHAR* argv[]){
hFile=CreateFile(_T("e:\\myfile.txt"), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, NULL);
if(INVALID_HANDLE_VALUE==hFile){
printf("CreateFile 失败:%d\n",GetLastError());
return 1;
}
if(!BindIoCompletionCallback(hFile,(LPOVERLAPPED_COMPLETION_ROUTINE)f,0)){
if(ERROR_IO_PENDING != GetLastError()){
printf("Bind failed:%d\n",GetLastError());
return 1;
}
}
WriteFile(hFile,(LPVOID)"helloworld",10,&dww,&overlap);
SleepEx(1000, TRUE);
printf("main结束\n");
CloseHandle(hFile);
return 0;
}
#include"stdafx.h"
#include<windows.h>
#include<stdio.h>
#include<tchar.h>
HANDLE hFile,hIocp;
DWORD dwr,dww;
OVERLAPPED overlap={0};
char content[10]={0};
VOID CALLBACK f(DWORD dwErrorCode,DWORD,LPOVERLAPPED){
WaitForSingleObject(hFile,INFINITE);
ReadFile(hFile,content,10,&dwr,&overlap);
printf("读取内容=%s\n",content);
}
int _tmain(int argc, _TCHAR* argv[]){
hFile=CreateFile(_T("e:\\myfile.txt"), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, NULL);
if(INVALID_HANDLE_VALUE==hFile){
printf("CreateFile 失败:%d\n",GetLastError());
return 1;
}
if(!BindIoCompletionCallback(hFile,(LPOVERLAPPED_COMPLETION_ROUTINE)f,0)){
if(ERROR_IO_PENDING != GetLastError()){
printf("Bind failed:%d\n",GetLastError());
return 1;
}
}
WriteFile(hFile,(LPVOID)"helloworld",10,&dww,&overlap);
SleepEx(1000, TRUE);
printf("main结束\n");
CloseHandle(hFile);
return 0;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货