Проверить степень заполненности буфера

 
0
 
C++
ava
fehler | 21.01.2013, 18:20
Ребята, есть вопрос. ReadFile читает в буффер, а можно как нибудь во время чтения проверять степень заполненности буфера, ведь его размер известен.
Kommentare (6)
ava
feodorv | 21.01.2013, 18:40 #
Цитата (fehler @  21.1.2013,  18:20 findReferencedText)
как нибудь во время чтения

Это как? Это чтобы система уведомляла Вас, что прочитано 10% из запрошенного? Потом 20%, 30% и т.д.? Это вряд ли.
Читайте отдельными секторами что ли...
ava
artsb | 21.01.2013, 20:15 #
У функции ReadFile() есть параметр lpNumberOfBytesRead.
При чтении из файла, обычно, в nNumberOfBytesToRead передают размер буфера. Функция читает максимальное количество байт из файла в буфер. Если в файле осталось байт меньше, чем nNumberOfBytesToRead, то она прочитает всё что осталось и запишет их количество в lpNumberOfBytesRead.
ava
Zmaster555 | 27.01.2013, 00:27 #
Цитата


во время чтения проверять степень заполненности буфера



Как вариант, перед началом чтения создать поток, который будет этим заниматься (проверять заполненность буфера), и убить его, когда чтение окончено.

UPD: Хотя нет, после недолгих размышлений, пришел к выводу что это глупо и неизвестно как проверять кол-во уже считанных байт.
ava
mega | 28.01.2013, 07:04 #
Zmaster555, если делать все по уму, то в Вашем случае нужно работать с "портами завершения" ( Completion Port ): http://habrahabr.ru/post/59282/
ava
xvr | 28.01.2013, 14:26 #
Цитата (GremlinProg @  28.1.2013,  07:04 findReferencedText)
то в Вашем случае нужно работать с "портами завершения"

Увы, даже completion port не поможет узнать сколько байт уже записалось в буфер в процессе выполнения ReadFile. Он сможет лишь обозначить момент, когда все байты уже записались (ну и собственно ReadFile закончился)  :nea

später ergänzt:
Боюсь, что напрямую эти данные вообще получить нельзя - чтение реализуется драйвером  (например - драйвером файловой системы), и никаких специальных функций ядра не предусмотренно для оповещения со стороны драйвера того самого ядра о процессе проведения запрошенной операции. Только об ее окончании.

Можно попытаться что то поймать на уровне управления виртуальной памятью. Например организовать буфер чтения в COPY-ON-WRITE памяти и мониторить состояние страниц этой самой памяти - были туда Write или еще нет  smile 
ava
mega | 28.01.2013, 14:44 #
само собой, ОСь не может нам сказать в удобное для нас время, сколько на данный момент записано в файл,
мы должны ей это предложить сами,

я это вижу в нескольких вариантах:

Вариант1.
1. заводим поток
2. в потоке делим передачу на N частей и читаем каждую часть отдельным ReadFile
3. из основного потока отслеживаем, на какой итерации находится читающий поток
Вариант2.
1. делим передачу на N частей и читаем каждую часть отдельным ReadFileEx(overlapped)
2. периодически вызываем SleepEx или WaitFor...Ex, которая по возможности будет вызывать APC, в котором мы и будем получать текущее состояние чтения
Вариант3.
аналогичный первому, только каждая итерация решается в пуле потоков, каждый из которых добавляется в Completion Port,
опрос которого опять же дает искомый (дискретный) результат
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
  mega ava  artsb   xvr ava  feodorv   Zmaster555   fehler
advanced
Absenden