Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверить степень заполненности буфера 
:(
    Опции темы
fehler
Дата 21.1.2013, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 21.1.2013

Репутация: нет
Всего: нет



Ребята, есть вопрос. ReadFile читает в буффер, а можно как нибудь во время чтения проверять степень заполненности буфера, ведь его размер известен.
PM MAIL   Вверх
feodorv
Дата 21.1.2013, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(fehler @  21.1.2013,  18:20 Найти цитируемый пост)
как нибудь во время чтения

Это как? Это чтобы система уведомляла Вас, что прочитано 10% из запрошенного? Потом 20%, 30% и т.д.? Это вряд ли.
Читайте отдельными секторами что ли...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
artsb
Дата 21.1.2013, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 5
Всего: 64



У функции ReadFile() есть параметр lpNumberOfBytesRead.
При чтении из файла, обычно, в nNumberOfBytesToRead передают размер буфера. Функция читает максимальное количество байт из файла в буфер. Если в файле осталось байт меньше, чем nNumberOfBytesToRead, то она прочитает всё что осталось и запишет их количество в lpNumberOfBytesRead.

Это сообщение отредактировал(а) artsb - 21.1.2013, 20:16


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Zmaster555
Дата 27.1.2013, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 14.1.2013

Репутация: нет
Всего: нет



Цитата

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


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

UPD: Хотя нет, после недолгих размышлений, пришел к выводу что это глупо и неизвестно как проверять кол-во уже считанных байт.

Это сообщение отредактировал(а) Zmaster555 - 27.1.2013, 01:13
PM MAIL   Вверх
GremlinProg
Дата 28.1.2013, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Zmaster555, если делать все по уму, то в Вашем случае нужно работать с "портами завершения" ( Completion Port ): http://habrahabr.ru/post/59282/


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
xvr
Дата 28.1.2013, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(GremlinProg @  28.1.2013,  07:04 Найти цитируемый пост)
то в Вашем случае нужно работать с "портами завершения"

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

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

Можно попытаться что то поймать на уровне управления виртуальной памятью. Например организовать буфер чтения в COPY-ON-WRITE памяти и мониторить состояние страниц этой самой памяти - были туда Write или еще нет  smile 

PM MAIL   Вверх
GremlinProg
Дата 28.1.2013, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



само собой, ОСь не может нам сказать в удобное для нас время, сколько на данный момент записано в файл,
мы должны ей это предложить сами,

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

Вариант1.
1. заводим поток
2. в потоке делим передачу на N частей и читаем каждую часть отдельным ReadFile
3. из основного потока отслеживаем, на какой итерации находится читающий поток
Вариант2.
1. делим передачу на N частей и читаем каждую часть отдельным ReadFileEx(overlapped)
2. периодически вызываем SleepEx или WaitFor...Ex, которая по возможности будет вызывать APC, в котором мы и будем получать текущее состояние чтения
Вариант3.
аналогичный первому, только каждая итерация решается в пуле потоков, каждый из которых добавляется в Completion Port,
опрос которого опять же дает искомый (дискретный) результат

Это сообщение отредактировал(а) GremlinProg - 28.1.2013, 16:29


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.