OVERLAPPED (, , lpOverlapped ReadFile) :
(64 ), , 3.
( ), .
OVERLAPPED.
typedef struct_OVERLAPPED {
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
HANDLE hEvent;
} OVERLAPPED
() Offset OffsetHigh, (OffsetHigh) 0. Internal InternalHigh, .
hEvent ( CreateEvent). , , (. 8), /; . / .
hEvent NULL; , (. ). , hEvent NULL, .
" " ("file handle"), , ReadFile, WriteFile , , , .
/ ( ). / , , /. , ( ), .
( FILE_FLAG_OVERLAPPED), OVERLAPPED SetFilePointer . ReadFile , / . 3. , / OVERLAPPED.
|
|
, .
OVERLAPPED , /, , .
, , OVERLAPPED.
, , , .
OVERLAPPED , /. , .
/
ReadFile WriteFile, , , , , . / , FALSE. GetLastError ERROR_IO_PENDING.
( , , ) , , , . GetOverlappedResult.
BOOL GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped, LPWORD lpcbTransfer, BOOL bWait)
/ OVERLAPPED. TRUE bWait , GetOverlappedResult ; . TRUE . GetOverlappedResult FALSE, GetLastError ERROR_IO_INCOMPLETE, /.
*lpcbTransfer. , / OVERLAPPED .
/
CancelIO /, ( ). , . , , . ERROR OPERATION ABORTED.
:
/ , . , .
|
|
, , , .
OVERLAPPED ov = { 0, 0, 0, 0, NULL /* . */ };
HANDLE hF;
DWORD nRead;
BYTE Buffer[BUF_SIZE];
hF = CreateFile(, FILE_FLAG_OVERLAPPED, );
ReadFile(hF, Buffer, sizeof(Buffer), &nRead, &ov);
/* . nRead .*/
/* . */
WaitForSingleObject(hF, INFINITE);
GetOverlappedResult(hF, &ov, &nRead, FALSE);
: /
2.4 (atou) ASCII- UNICODE , 5 , . 14.1 (atouOV) / , .
14.1 . , , , .
OVERLAPPED, . OVERLAPPED. . WaitForMultipleObjects , . , . . , , , WaitForMultipleObjects.
. 14.1.
14.1. atouOV: /
/* 14. atouOV
ASCII Unicode /. Windows NT. */
#include "EvryThng.h"
#define MAX_OVRLP 4 /* /.*/
#define REC_SIZE 0x8000 /* 32 : , . */
#define UREC_SIZE 2 * REC_SIZE
int _tmain(int argc, LPTSTR argv[]) {
HANDLE hInputFile, hOutputFile;
/* */
/* */
/* /. */
DWORD nin[MAX_OVRLP], nout[MAX_OVRLP], ic, i;
OVERLAPPED OverLapIn[MAX_OVRLP], OverLapOut[MAX_OVRLP];
/* , */
/* WaitForMultipleObjects. */
/* 0 , 1 .*/
HANDLE hEvents[2][MAX_OVRLP];
/* */
/* /. */
CHAR AsRec[MAX_OVRLP][REC_SIZE];
WCHAR UnRec[MAX_OVRLP][REC_SIZE];
LARGE_INTEGER CurPosIn, CurPosOut, FileSize;
|
|
LONGLONG nRecord, iWaits;
hInputFile = CreateFile(argv[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
hOutputFile = CreateFile(argv[2], GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_OVERLAPPED, NULL);
/* , , */
/* . , , */
/* . */
FileSize.LowPart = GetFileSize(hInputFile, &FileSize.HighPart);
nRecord = FileSize.QuadPart / REC_SIZE;
if ((FileSize.QuadPart % REC_SIZE)!= 0) nRecord++;
CurPosIn.QuadPart = 0;
for (ic = 0; ic < MAX_OVRLP; ic++) {
/* OVERLAPPED.*/
hEvents[0][ic] = OverLapIn[ic].hEvent /* .*/
= CreateEvent(NULL, TRUE, FALSE, NULL);
hEvents[1][ic] = OverLapOut[ic].hEvent /* . */
= CreateEvent(NULL, TRUE, FALSE, NULL);
/* OVERLAPPED. */
OverLapIn[ic].Offset = CurPosIn.LowPart;
OverLapIn[ic].OffsetHigh = CurPosIn.HighPart;
/* OVERLAPPED. */
if (CurPosIn.QuadPart < FileSize.QuadPart) ReadFile(hInputFile, AsRec[ic], REC_SIZE, &nin[ic], &OverLapIn[ic]);
CurPosIn.QuadPart += (LONGLONG)REC_SIZE;
}
/* . . . */
iWaits =0; /* /. */
while (iWaits < 2 * nRecord) {
ic = WaitForMultipleObjects(2 * MAX_OVRLP, hEvents[0], FALSE, INFINITE) WAIT_OBJECT_0;
iWaits++; /* .*/
ResetEvent(hEvents[ic / MAX_OVRLP][ic % MAX_OVRLP]);
if (ic < MAX_OVRLP) {
/* . */
GetOverlappedResult(hInputFile, &OverLapIn[ic], &nin[ic], FALSE);
/* . */
CurPosIn.LowPart = OverLapIn[ic].Offset;
CurPosIn.HighPart = OverLapIn[ic].OffsetHigh;
CurPosOut.QuadPart = (CurPosIn.QuadPart / REC_SIZE) * UREC_SIZE;
OverLapOut[ic].Offset = CurPosOut.LowPart;
OverLapOut[ic].OffsetHigh = CurPosOut.HighPart;
/* ASCII Unicode. */
for (i =0; i < REC_SIZE; i++) UnRec[ic][i] = AsRec[ic][i];
WriteFile(hOutputFile, UnRec[ic], nin[ic] * 2, &nout[ic], &OverLapOut[ic]);
/* , , . */
CurPosIn.QuadPart += REC_SIZE * (LONGLONG)(MAX_OVRLP);
OverLapIn[ic].Offset = CurPosIn.LowPart;
OverLapIn[ic].OffsetHigh = CurPosIn.HighPart;
} else if (ic < 2 * MAX_OVRLP) { /* . */
/* . */
ic = MAX_OVRLP; /* . */
if (!GetOverlappedResult (hOutputFile, &OverLapOut[ic], &nout[ic], FALSE)) ReportError(_T(" ."), 0, TRUE);
CurPosIn.LowPart = OverLapIn[ic].Offset;
CurPosIn.HighPart = OverLapIn[ic].OffsetHigh;
if (CurPosIn.QuadPart < FileSize.QuadPart) {
/* . */
ReadFile(hInputFile, AsRec[ic], REC_SIZE, &nin[ic], &OverLapIn[ic]);
}
}
}
/* . */
for (ic = 0; ic < MAX_OVRLP; ic++) {
CloseHandle(hEvents[0][ic]);
CloseHandle(hEvents[1][ic]);
}
CloseHandle(hInputFile);
CloseHandle(hOutputFile);
return 0;
}
14.1 Windows NT. / Windows 9x . , atouOV. , , , 32 , / . , SMP, , , .
|
|
/
. , /. / . (callback) , 10, (alertable wait states).
? ReadFile WriteFile , . /, "" , . , , ReadFileEx WriteFileEx. , .
WaitForSingleObjectEx
WaitForMultipleObjectsEx
SleepEx
SignalObjectAndWait
MsgWaitForMultipleObjectsEx
/ / (alertable I/O). , , .
Windows 9x / . , / Windows 9x , , .