|
|
비동기 IOCP 로 파일 쓰기
등록자 : cpueblo (유광희), 2008-09-02
글수정 | 글삭제
#include
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPSTR lpszClass="AsyncIO";
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
hWndMain=hWnd;
while(GetMessage(&Message,0,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
char *buf;
HANDLE hFile;
OVERLAPPED ov;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
char Mes[]="마우스 왼쪽 버튼을 누르면 비동기 출력을 합니다";
BOOL Result;
DWORD dwWritten, Tran=0;
char str[256],sTmp[256];
char *p,*pt;
static DWORD len, Count=1;
int i;
switch(iMessage) {
case WM_CREATE:
// 20M 분량의 버퍼를 준비한다.
buf=(char *)malloc(20000000);
if (buf == NULL) {
MessageBox(hWnd,"메모리 할당에 실패했습니다","에러",MB_OK);
return -1;
}
// 버퍼에 문자열을 준비한다.
p=buf;
for (i=1;i<300000;i++) {
wsprintf(sTmp,"%dLine : This file is a test file for overlapped file I/O\r\n",i);
pt=sTmp;
while (*pt) *p++=*pt++;
}
len=p-buf;
return 0;
case WM_LBUTTONDOWN:
// 출력 파일 생성
hFile=CreateFile("c:\\BigFile.txt",GENERIC_WRITE,0,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL);
if (hFile == INVALID_HANDLE_VALUE) {
MessageBox(hWnd,"파일 생성 에러","",0);
return 0;
}
// 비동기 출력
ov.Offset=0;
ov.OffsetHigh=0;
ov.hEvent=NULL;
Result=WriteFile(hFile,buf,len,&dwWritten,&ov);
if ((Result==FALSE) && (GetLastError()==ERROR_IO_PENDING)) {
MessageBeep(0);
}
SetTimer(hWnd,1,10,NULL);
return 0;
case WM_TIMER:
// 출력 상태를 조사해 보여준다.
/*
// 파일 핸들을 사용하는 방법
if (WaitForSingleObject(hFile,0)==WAIT_OBJECT_0) {
KillTimer(hWnd,1);
CloseHandle(hFile);
hFile=NULL;
wsprintf(str,"카운트=%d. 작업 완료",Count);
} else {
wsprintf(str,"카운트=%d. 출력중",Count);
}
//*/
//*
// 비동기 입출력 상태를 조사하는 방법
Result=GetOverlappedResult(hFile,&ov,&Tran,FALSE);
if (Tran==len) {
wsprintf(str,"카운트=%d,총 %d바이트 출력을 완료했습니다.",Count,Tran);
KillTimer(hWnd,1);
CloseHandle(hFile);
hFile=NULL;
} else {
wsprintf(str,"카운트=%d,%d바이트 읽고 있는 중입니다",Count,Tran);
}
//*/
Count++;
hdc=GetDC(hWnd);
TextOut(hdc,10,10,str,strlen(str));
ReleaseDC(hWnd,hdc);
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
TextOut(hdc,10,30,Mes,strlen(Mes));
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
if (hFile)
CloseHandle(hFile);
free(buf);
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
글수정 | 글삭제
http://codesarang.com. mail to cpueblo cpueblo.com
|
|