.


:




:

































 

 

 

 


OVERLAPPED




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 , , .





:


: 2015-09-20; !; : 775 |


:

:

, .
==> ...

1549 - | 1389 -


© 2015-2024 lektsii.org - -

: 0.039 .