async. io
От: sergei_132 http://sergbox.blogspot.com
Дата: 03.11.06 09:26
Оценка:
Hello All!

такой вот вопрос:
как сделать такую ситуацию, чтобы файл считался не сразу?
а то я вызываю ReadFileEx — и послее ее выполнения файл всегда оказывается считанным..
(файл открыл с флагом FILE_FLAG_OVERLAPPED)
Re: async. io
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.11.06 09:53
Оценка:
Здравствуйте, sergei_132, Вы писали:

_>как сделать такую ситуацию, чтобы файл считался не сразу?

_>а то я вызываю ReadFileEx — и послее ее выполнения файл всегда оказывается считанным..
_>(файл открыл с флагом FILE_FLAG_OVERLAPPED)

Например, взять файл размером в несколько десятков мегабайт.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: async. io
От: sergei_132 http://sergbox.blogspot.com
Дата: 03.11.06 10:18
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Например, взять файл размером в несколько десятков мегабайт.


попробовал 100Mb — такая ошибка
Insufficient system resources exist to complete the requested service. ERROR_NO_SYSTEM_RESOURCES

а попробовал 50 Mb — считывается сразу. где же асинхронность?

может я что-нибудь неправильно делаю:
    size=512*195000;
    buf=(char*)VirtualAlloc(NULL,size,MEM_COMMIT,PAGE_READWRITE);
    if (!buf)return;
  
    hfile=CreateFile(L"c:\\file.rar", FILE_READ_DATA,
        FILE_SHARE_READ, NULL,OPEN_EXISTING,
        FILE_FLAG_OVERLAPPED|FILE_FLAG_NO_BUFFERING, 0);

    if (hfile==INVALID_HANDLE_VALUE)
    {    
        GetLastError();
        return ;
    }

    memset(&ovrl,0,sizeof(OVERLAPPED));

    while (1)
    {
        if (ReadFileEx(hfile,buf,size,&ovrl,CompRoutine)==0)
        {
            i=GetLastError();
            return;            
        }
        if(!HasOverlappedIoCompleted(&ovrl)){
            i++;
                }
        WaitForSingleObject( hfile, INFINITE);
    }
Re[3]: async. io
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.11.06 10:36
Оценка:
Здравствуйте, sergei_132, Вы писали:

_>может я что-нибудь неправильно делаю:


Зависит от того, каким образом Вы определяете, что файл "считался сразу".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: async. io
От: sergei_132 http://sergbox.blogspot.com
Дата: 03.11.06 10:40
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Зависит от того, каким образом Вы определяете, что файл "считался сразу".


очевидно, что сразу после выхода из функци ReadFileEx — буфер оказывается заполненным считанными данными.

я хочу добиться того, чтобы после выхода из этой ф-ии файл не был еще считан
Re[5]: async. io
От: Аноним  
Дата: 03.11.06 11:35
Оценка:
Здравствуйте, sergei_132, Вы писали:

_>Здравствуйте, Евгений Музыченко, Вы писали:


ЕМ>>Зависит от того, каким образом Вы определяете, что файл "считался сразу".


_>очевидно, что сразу после выхода из функци ReadFileEx — буфер оказывается заполненным считанными данными.


_>я хочу добиться того, чтобы после выхода из этой ф-ии файл не был еще считан


Помоему, вы занимаетесь маразмом и неправильно понимаете понятие "асинхронность".
Асинхронность — это в данном случае возврат управления сразу после запуска процесса чтения, а то что буфер заполнился сразу после возврата, это говорит только о быстродействии запоминающего устройства.
Re[6]: async. io
От: sergei_132 http://sergbox.blogspot.com
Дата: 03.11.06 13:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Помоему, вы занимаетесь маразмом и неправильно понимаете понятие "асинхронность".

А>Асинхронность — это в данном случае возврат управления сразу после запуска процесса чтения, а то что буфер заполнился сразу после возврата, это говорит только о быстродействии запоминающего устройства.

подскажите тогда такой тест, чтобы запоминающее устройство не могло так быстро выполнить операцию...

все равно, должно же хоть когда то не успеть выполниться...
Re[7]: async. io
От: ДимДимыч Украина http://klug.org.ua
Дата: 03.11.06 13:31
Оценка:
Здравствуйте, sergei_132, Вы писали:

_>подскажите тогда такой тест, чтобы запоминающее устройство не могло так быстро выполнить операцию...


Сбросить / вытеснить каким-нибудь образом дисковый кэш?
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[5]: async. io
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.11.06 14:11
Оценка:
Здравствуйте, sergei_132, Вы писали:

_>я хочу добиться того, чтобы после выхода из этой ф-ии файл не был еще считан


Это я уже понял. Я спросил — как Вы определяете, что непосредственно после возврата из ReadFileEx буфер уже заполнен? Из приведенного Вами фрагмента кода этого не видно. Текст функции CompRoutine тоже неплохо бы привести, хотя в данном примере она вызываться не должна.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: async. io
От: sergei_132 http://sergbox.blogspot.com
Дата: 03.11.06 14:24
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:


ЕМ>Это я уже понял. Я спросил — как Вы определяете, что непосредственно после возврата из ReadFileEx буфер уже заполнен? Из приведенного Вами фрагмента кода этого не видно. Текст функции CompRoutine тоже неплохо бы привести, хотя в данном примере она вызываться не должна.


ну хотя бы по тому , что HasOverlappedIoCompleted всегда == TRUE
Re[6]: async. io
От: sergei_132 http://sergbox.blogspot.com
Дата: 03.11.06 14:33
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:


ЕМ>Это я уже понял. Я спросил — как Вы определяете, что непосредственно после возврата из ReadFileEx буфер уже заполнен? Из приведенного Вами фрагмента кода этого не видно. Текст функции CompRoutine тоже неплохо бы привести, хотя в данном примере она вызываться не должна.


CompRoutine — не вызывается, хотя можно заменить WaitForSingleObject на SleepEx

хотя какая разница вызывать CompRoutine или нет....
Re[7]: async. io
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.11.06 15:12
Оценка:
Здравствуйте, sergei_132, Вы писали:

_>ну хотя бы по тому , что HasOverlappedIoCompleted всегда == TRUE


Последний раз: если Вам нужна помощь — покажите весь код, имеющий отношение к проблеме. В противном случае — разбирайтесь сами, не отнимайте времени у сообщества.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: async. io
От: sergei_132 http://sergbox.blogspot.com
Дата: 03.11.06 17:44
Оценка:
все, разобрался. действительно данные читаются асинхронно

просто я не правильно понял, что должна возвращать ф-ия HasOverlappedIoCompleted

MSDN: "Returns TRUE if the I/O operation has completed, and FALSE otherwise."

оказывается она всегда возвращает TRUE, даже если данные записаны не все.

(а я то думал, что она возвращает FALSE если данные записаны не все)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.