반응형
#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);*/ }
반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."