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