CodeSarang.Com
Home | All categories Join | Login | 검색   

 

비동기 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 cpueblocpueblo.com