.


:




:

































 

 

 

 





/ , OVERLAPPED, , .

, , , . , , /. , . , , OVERLAPPED , .

SleepEx , , WAIT_TO_COMPLETION, GetLastError, .

:

1. INFINITE. , .

2. hEvent OVERLAPPED, .

, . 14.2. , , .

. 14.2. /

: /

14.3 (atouEX) 14.1. /. atouEx 14.1, , , , , . , , atouEx , , atouOV .

14.2. atouEx: /

/* 14. atouEX

ASCII Unicode /. */

/* atouEX 1 2 */

 

#include "EvryThng.h"

#define MAX_OVRLP 4

#define REC_SIZE 8096 /* , atouOV. */

#define UREC_SIZE 2 * REC_SIZE

 

static VOID WINAPI ReadDone(DWORD, DWORD, LPOVERLAPPED);

static VOID WINAPI WriteDone(DWORD, DWORD, LPOVERLAPPED);

 

/* OVERLAPPED , . . */

OVERLAPPED OverLapIn[MAX_OVRLP], OverLapOut [MAX_OVRLP];

CHAR AsRec[MAX_OVRLP][REC_SIZE];

WCHAR UnRec[MAX_OVRLP][REC_SIZE];

HANDLE hInputFile, hOutputFile;

LONGLONG nRecord, nDone;

LARGE_INTEGER FileSize;

 

int _tmain(int argc, LPTSTR argv[]) {

DWORD ic;

LARGE_INTEGER CurPosIn;

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++) {

OverLapIn[ic].hEvent = (HANDLE)ic; /* . */

OverLapOut[ic].hEvent = (HANDLE)ic; /* . */

OverLapIn[ic].Offset = CurPosIn.LowPart;

OverLapIn[ic].OffsetHigh = CurPosIn.HighPart;

if (CurPosIn.QuadPart < FileSize.QuadPart) ReadFileEx(hInputFile, AsRec[ic], REC_SIZE, &OverLapIn [ic], ReadDone);

CurPosIn.QuadPart += (LONGLONG)REC_SIZE;

}

/* . , .*/

nDone = 0;

while (nDone < 2 * nRecord) SleepEx(INFINITE, TRUE);

CloseHandle(hInputFile);

CloseHandle(hOutputFile);

_tprintf(_T(" ASCII Unicode .\n"));

return 0;

}

 

static VOID WINAPI ReadDone(DWORD Code, DWORD nBytes, LPOVERLAPPED pOv) {

/* . . */

LARGE_INTEGER CurPosIn, CurPosOut;

DWORD ic, i;

nDone++;

/* . */

ic = (DWORD)(pOv->hEvent);

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 < nBytes; i++) UnRec[ic][i] = AsRec[ic][i];

WriteFileEx(hOutputFile, UnRec[ic], nBytes*2, &OverLapOut[ic], WriteDone);

/* OVERLAPPED . */

CurPosIn.QuadPart += REC_SIZE * (LONGLONG)(MAX_OVRLP);

OverLapIn[ic].Offset = CurPosIn.LowPart;

OverLapIn[ic].OffsetHigh = CurPosIn.HighPart;

return;

}

 

static VOID WINAPI WriteDone(DWORD Code, DWORD nBytes, LPOVERLAPPED pOv) {

/* . . */

LARGE_INTECER CurPosIn;

DWORD ic;

nDone++;

ic = (DWORD)(pOv->hEvent);

CurPosIn.LowPart = OverLapIn[ic].Offset;

CurPosIn.HighPart = OverLapIn[ic].OffsetHigh;

if (CurPosIn.QuadPart < FileSize.QuadPart) {

ReadFileEx(hInputFile, AsRec[ic], REC_SIZE, &OverLapIn[ic], ReadDone);

}

return;

}

/

/ / , . .

Windows , / , . grepMT ( 7). , , , /. , 14.1 14.2, , .

atouMT, , , Web-. atouMT Windows, /, . , . .

atouMT., Web-, "", . , CreateHandle, DuplicateHandle.

, /. , .

. , , , , . , /, .





:


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


:

:

, .
==> ...

1532 - | 1422 -


© 2015-2024 lektsii.org - -

: 0.013 .