我的目标是使用MSDN API从A读取dataBuffer并将数据重复写入设备B。我正在使用ReadFileEx和WriteFileEx来请求重叠的I / O读写,因此使用ReadFile和WriteFile的原始耗时的for循环现在可以进入后台,并且UI主线程可以一直响应。
我首先创建结构MY_OVERLAPPED,该结构继承自OVERLAPPED,并添加了两个以上的元素,event是指向MyClass的指针,该指针可以帮助访问该类中的变量,句柄,dataBuffer等,并且count分别用于重置Offset值ReadFileEx调用之前的时间。读取位置为count * 524288,因为我每次读取524288字节并存储在dataBuffer中。
我的问题是: 1.如何不使用继承的OVERLAPPED结构的Offset元素来更改读取位置,例如使用引用计数?
2。以下代码无法按照我的方式工作。 ReadCompletionRoutine只能运行一次,最终会收到非常长的偏移号。现在,我假设这是问题所在,并且首先关注它,所以请随时纠正我的任何代码结构。
我的代码流是: 1.将读取点设置为0 2.调用重叠的ReadFileEx 3.将调用ReadCompletion,将使用重叠的WriteFileEx写入读取的数据 4.将调用WriteCompletion,将指针设置为下一个524288字节并读取 5.(依此类推)两个完成例程将互相调用,直到所有数据都被传输
MyClass.h
struct MY_OVERLAPPED: OVERLAPPED {
MyClass *event;
unsigned long long count;
};
MyClass.cpp-主
MY_OVERLAPPED overlap;
memset(&overlap, 0,sizeof(overlap));
//point to this class (MyClass), so all variables can later be accessed
overlap.event = this;
//set read position******how do I not use Offset??
overlap.Offset = 0;
overlap.OffsetHigh = 0;
overlap.count = 0;
//start the first read io request, read 524288 bytes, which 524288 bytes will be written in ReadCompletionRoutine
ReadFileEx(overlap.event->hSource, overlap.event->data, 524288, &overlap, ReadCompletionRoutine);
SleepEx(0,TRUE);
MyClass.cpp-回调
void CALLBACK ReadCompletionRoutine(DWORD errorCode, DWORD bytestransfered, LPOVERLAPPED lpOverlapped)
{
//type cast to MY_OVERLAPPED
MY_OVERLAPPED *overlap = static_cast<MY_OVERLAPPED*>(lpOverlapped);
//write 524288 bytes and continue to read next 524288 bytes in WriteCompletionRoutine
WriteFileEx(overlap->event->hDevice, overlap->event->data, 524288, overlap, WriteCompletionRoutine);
}
void CALLBACK WriteCompletionRoutine(DWORD errorCode, DWORD bytestransfered, LPOVERLAPPED lpOverlapped)
{
MY_OVERLAPPED *overlap = static_cast<MY_OVERLAPPED*>(lpOverlapped);
//set new offset to 524288*i, i = overlap->count for next block reading
overlap->count = (overlap->count)+1;
LARGE_INTEGER location;
location.QuadPart = 524288*(overlap->count);
overlap->Offset = location.LowPart;
overlap->OffsetHigh = location.HighPart;
ReadFileEx(overlap->event->hSource, overlap->event->data, 524288, overlap, ReadCompletionRoutine);
}