똑같은글 여기도 올라왔네 =_=a 먼저본게 뎁피아니 거기다 답 달게요.
Hun_ 님이 쓰신 글 :
: 대용량 파일(4GB)을 읽으려 합니다. 파일을 읽을 때 비동기 방식을 이용하여 읽기 시간을 단축하려고 합니다. CreateFile과 ReadFile를 이용하여 테스트한 결과 일반적인 방식(동기 방식)과 비동기 방식의 차이점이 없습니다.
:
: 아래의 코드와 같이 CreateFile을 이용하여 파일을 연후 ReaFile 을 이용하여 읽고 있습니다. 일반적인 방식(동기 방식)과 비동기 방식은 CreateFile에서FILE_FLAG_OVERLAPPED와 ReadFile에서 OVERLAPPED 구조체 사용만이 다릅니다.
:
: 궁금 사항
:
: 1. 비동기 방식 사용법이 잘못 된 것인가요?
:
: 2. ReadFile이 완료를 알기 위해 GetOverlappedResult를 사용하였는데 이 부분에서 비동기 방식의 이점인 논블록 효과가 없어집니다. 사용이 잘못 되었나요?
:
: 3. ReadFile의 경우 일반적인 방식(동기 방식)과 비동기 방식의 차이점이 없는 것인가요?(WriteFile의 경우 시간을 단축할 수 있었습니다. GetOverlappedResult를 사용안함.)
:
: 4. IOCP(CreateIoCompletionPort)를 이용하려고 합니다. 단일 파일의 경우 아래의 링크에서 효과가 없다고 하는데 사용하게 된다면 정말 효과를 볼 수 없을까요?
:
: (
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=630180&ref=630161)
:
: 5. 실제 비동기적 효과를 보기 위해서는 가장 효과적이며 일반적인지 궁금합니다.
:
:
: 아래의 코드는 샘플 입니다. 형식은 상관없습니다.
:
: --------------------------------------------------------------------------------------------------
: 비동기 방식 코드
: --------------------------------------------------------------------------------------------------
: HANDLE hFile = CreateFile(_T(“C:\4G_test”),
: GENERIC_READ | GENRIC_WRITE,
: FILE_SHARE_READ | FILE_SHARE_WRITE,
: NULL,
: OPEN_EXISTING,
: FILE_FLAG_OVERLAPPED,
: NULL);
:
: OVERLAPPED cbOv = {0};
:
: while(cbOv.offset < 파일 사이즈)
: {
: ReadFile(hFile, lpBuffer, uBufferSize, &dwRead, &cbOv);
: if(GetLastError() != ERROR_IO_PENDING)
: return FALSE; // ReadFile Error
:
:
: GetOverlappedResult(hDevice, &cbOv, &dwRead, TRUE);
:
: ...
: cbOv.offset += dwRead;
: }
:
: --------------------------------------------------------------------------------------------------
: 일반 방식(동기 방식) 코드
: --------------------------------------------------------------------------------------------------
:
: HANDLE hFile = CreateFile(_T(“C:\4G_test”),
: GENERIC_READ | GENRIC_WRITE,
: FILE_SHARE_READ | FILE_SHARE_WRITE,
: NULL,
: OPEN_EXISTING,
: FILE_ATTRIBUTE_NORMAL,
: NULL);
:
: OVERLAPPED cbOv = {0};
: BOOL bRead;
:
: while(cbOv.offset < 파일 사이즈)
: {
: bRead = ReadFile(hFile, lpBuffer, uBufferSize, &dwRead, NULL);
: if(!bRead)
: return FALSE; // ReadFile Error
:
: ...
:
: cbOv.offset += dwRead;
: }
:
: 감사합니다.