два OVERLAPPED подряд и косяк
От: Captain  
Дата: 09.09.04 12:05
Оценка:
Всем привет.

Ситуация такая
1)Открываем файл, с флагами FILE_FLAG_OVERLAPPED и FILE_FLAG_NO_BUFFERING.
2)Читаем из файла первый блок
3)Читаем из файла второй блок
4)Смотрим результаты оверлапеда, по первому блоку = ОК
5)Смотрим результаты оверлапеда, по второму блоку = ОК, но GetOverlappedResult в переменной "кол-во" прочитанных байт возвращает 0.

Но когда трассировать или делая задержки между пунктами 2 и 3, то всё работает. В чём проблема подскажите плиз .
Ниже функция, которая это показывает.
Платформа Win 2000
Размер кластера 512
Размер читаемого файла 2 694 215

вроде всё ровно.

P.S. Похоже что винда не позволяет делать два оверлапеда на одном хендле. Кто чем может помогите


void Test(TCHAR *sFileName)
{
    OVERLAPPED ov1;
    OVERLAPPED ov2;

    DWORD bytes1;
    DWORD bytes2;

    BYTE b1[0x10000];
    BYTE b2[0x10000];

    bool lock1 = false;
    bool lock2 = false;

    memset(&ov1, 0, sizeof(ov1));
    memset(&ov2, 0, sizeof(ov2));

    ov2.Offset = sizeof(b1);

    HANDLE hFile = ::CreateFile(sFileName,
        GENERIC_READ,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        0,
        OPEN_EXISTING,
        0
        | FILE_FLAG_OVERLAPPED
        | FILE_FLAG_NO_BUFFERING,
        0);

    if(hFile == INVALID_HANDLE_VALUE)
        return ;

    //чтение первого буфера
    if(!::ReadFile(hFile,
                b1,
                sizeof(b1),
                &bytes1,
                &ov1))
    {        
        if(::GetLastError() != ERROR_IO_PENDING)
        {                
             ::MessageBox(0, "ERROR", "ERROR", 0);             
        }            
        lock1 = true;
    }
    
    //чтение второго буфера
    if(!::ReadFile(hFile,
                b2,
                sizeof(b2),
                &bytes2,
                &ov2))
    {        
        if(::GetLastError() != ERROR_IO_PENDING)
        {                
            ::MessageBox(0, "ERROR", "ERROR", 0);
            return;
        }            
        lock2 = true;
    }

    if(lock1)
    {
        if(!::GetOverlappedResult(hFile,
                    &ov1,                    
                    &bytes1,
                    TRUE))
                    ::MessageBox(0, "GetOverlappedResult1", "ERROR", 0);
    }

    if(lock2)
    {
        if(!::GetOverlappedResult(hFile,
                    &ov2,
                    &bytes2,
                    TRUE))
                    ::MessageBox(0, "GetOverlappedResult2", "ERROR", 0);
    }

    if(!bytes1)
    {
        ::MessageBox(0, "KOSYK bytes1 == 0", "ERROR", 0);
    }

    if(!bytes2)
    {
        ::MessageBox(0, "KOSYK bytes2 == 0", "ERROR", 0);
    }

    ::CloseHandle(hFile);
}


вылетает сообщение "KOSYK bytes2 == 0"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.