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

 
0
 
C++
ava
fehler | 21.01.2013, 18:20
Ребята, есть вопрос. ReadFile читает в буффер, а можно как нибудь во время чтения проверять степень заполненности буфера, ведь его размер известен.
Ответы (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

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

Можно попытаться что то поймать на уровне управления виртуальной памятью. Например организовать буфер чтения в 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,
опрос которого опять же дает искомый (дискретный) результат
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  mega ava  artsb   xvr ava  feodorv   Zmaster555   fehler
advanced
Отправить