![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| fehler |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 21.1.2013 Репутация: нет Всего: нет |
Ребята, есть вопрос. ReadFile читает в буффер, а можно как нибудь во время чтения проверять степень заполненности буфера, ведь его размер известен.
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Это как? Это чтобы система уведомляла Вас, что прочитано 10% из запрошенного? Потом 20%, 30% и т.д.? Это вряд ли. Читайте отдельными секторами что ли... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 5 Всего: 64 |
У функции ReadFile() есть параметр lpNumberOfBytesRead.
При чтении из файла, обычно, в nNumberOfBytesToRead передают размер буфера. Функция читает максимальное количество байт из файла в буфер. Если в файле осталось байт меньше, чем nNumberOfBytesToRead, то она прочитает всё что осталось и запишет их количество в lpNumberOfBytesRead. Это сообщение отредактировал(а) artsb - 21.1.2013, 20:16 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| Zmaster555 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 14.1.2013 Репутация: нет Всего: нет |
Как вариант, перед началом чтения создать поток, который будет этим заниматься (проверять заполненность буфера), и убить его, когда чтение окончено. UPD: Хотя нет, после недолгих размышлений, пришел к выводу что это глупо и неизвестно как проверять кол-во уже считанных байт. Это сообщение отредактировал(а) Zmaster555 - 27.1.2013, 01:13 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Zmaster555, если делать все по уму, то в Вашем случае нужно работать с "портами завершения" ( Completion Port ): http://habrahabr.ru/post/59282/
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Увы, даже completion port не поможет узнать сколько байт уже записалось в буфер в процессе выполнения ReadFile. Он сможет лишь обозначить момент, когда все байты уже записались (ну и собственно ReadFile закончился) Добавлено через 7 минут и 18 секунд Боюсь, что напрямую эти данные вообще получить нельзя - чтение реализуется драйвером (например - драйвером файловой системы), и никаких специальных функций ядра не предусмотренно для оповещения со стороны драйвера того самого ядра о процессе проведения запрошенной операции. Только об ее окончании. Можно попытаться что то поймать на уровне управления виртуальной памятью. Например организовать буфер чтения в COPY-ON-WRITE памяти и мониторить состояние страниц этой самой памяти - были туда Write или еще нет |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 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 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |