два 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"
Re: два OVERLAPPED подряд и косяк
От: jabber  
Дата: 09.09.04 13:17
Оценка: 1 (1)
Здравствуйте, Captain

попробуйте так

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

    HANDLE he1=CreateEvent(NULL,false,false,NULL);
    HANDLE he2=CreateEvent(NULL,false,false,NULL);
    ov1.hEvent=he1;
    ov2.hEvent=he2;
        
        ....
        
        CloseHandle(he1);
        CloseHandle(he2);


ибо

Windows NT/2000: If the hEvent member of the OVERLAPPED structure is NULL, the system uses the state of the hFile handle to signal when the operation has been completed. Use of file, named pipe, or communications-device handles for this purpose is discouraged. It is safer to use an event object because of the confusion that can occur when multiple simultaneous overlapped operations are performed on the same file, named pipe, or communications device. In this situation, there is no way to know which operation caused the object's state to be signaled.


<< jabber >>
Re[2]: два OVERLAPPED подряд и косяк
От: Captain  
Дата: 10.09.04 03:38
Оценка:
Здравствуйте, jabber


Спасибо!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.