본문 바로가기
IT창고/System

비동기 IO / IOCP(윈도우에만 있다.)

by 창구창고 2007. 1. 22.
반응형
#include<windows.h>
#include<stdio.h>
#include<conio.h>
DWORD WINAPI foo(void *p)
{
	HANDLE hPort = (HANDLE)p;

	//이제 IOCP의 오나료 Q에 완료된 비동기 작업을 들어 올때 까지 대기한다.
	DWORD key;
	DWORD bytes;
	OVERLAPPED * ov;
	while(1)
	{
		GetQueuedCompletionStatus(hPort, &bytes, &key, &ov, INFINITE);

		printf("비동기 작업이 완료 되었습니다.\n");
		printf("완료키 : %d\n", key);
		printf("Bytes  : %d\n", bytes);
	}
	return 0;
}
void main()
{
	HANDLE hFile = CreateFile("COM1", //Serial Port Open
		GENERIC_WRITE,
		FILE_SHARE_READ | FILE_SHARE_WRITE,
		0,
		OPEN_EXISTING,
		//FILE_ATTRIBUTE_NORMAL,//동기적으로 OPEN
		FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//비동기적으로 오픈
		0);
	if(hFile == INVALID_HANDLE_VALUE)
	{
		printf("COM1 을 Open할 수 없습니다.\n");
		return ;
	}
	const int size =1024;
	char buf[size];
	DWORD len = 0;
///*---------------------------------------------------------------------------------------------------------------
	//IOCP(입출력 완료포트)를 생성한다.
	HANDLE hPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,
											0,
											0,
											2);// 동시에 대기 가능 스레드수

	//완성된 IOCP에 파일의 핸들을 추가한다.
	CreateIoCompletionPort(hFile, hPort, 1, //완료키
		                                 2);

	//새로운 스레드르 만들어서 비동기 IO의 완료를 처리한다.
	HANDLE hThread = CreateThread(0,0,foo,(void *)hPort,0,0);
	CloseHandle(hThread);

	//---------------------------------------------------------
	// 이제 비동기 작업을 수행한다.

	OVERLAPPED ov = { 0 };
	BOOL b = WriteFile(hFile, buf, size, &len, &ov);

	//다른작업 ....비동기 작업 완료시 처리는 다른 스레드가 해제 한다.
	getch();

	//비동기로 출력한다.

//---------------------------------------------------------------------------------------------------------------
//*/
/*
	//비동기적으로 출력한다.
	//---------------------------------------------------
	OVERLAPPED ov = {0}; //비동기적으로 할때 쓴다.
	ov.hEvent		= CreateEvent(0,0,0,"e"); // 작업당 한개의 Event를 준다.
	ov.Offset		= 0;
	ov.OffsetHigh	= 0; //작업당 별개의 파일 offset을 제공한다.
	ov.Internal		= 0;
	ov.InternalHigh	= 0; //OS가 내부적으로 사용하는 항목 -  사용자는 변경하지 않는다.
	//---------------------------------------------------
	BOOL b = WriteFile(hFile, buf, size, &len, &ov);
											//  ↑ 0이면 동기 OVERLAPPED 변수가 들어가면 비동기
	if(b == TRUE)
	{
		printf("동기적으로 파일 출력완료 \n");
	}
	//--------------------비동기 구간-------------------------
	else if(b == FALSE && GetLastError() == ERROR_IO_PENDING)
	{
		printf("비동기적으로 작업중.......\n");
		//다른 작업을 마친후 파일작업을 끝날때 까지 기다리려면
		WaitForSingleObject(ov.hEvent, INFINITE);
		
		//WaitForSingleObject(hFile, INFINITE); // 비동기적으로 할때 가끔쓰나 느려서 잘 안쓴다.

		printf("비동기 작업완료 !!\n");
	}
	//--------------------비동기 구간-------------------------
	else 
		printf("실패\n");
	CloseHandle(hFile);*/
}
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."