![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
сильно сомневаюсь, что это правильный путь, т.к. в теории, такая проекция файла может кешировать данные между потоками и процессами, ну раз эмулируется повторное открытие файла - точно, ситуация может сложиться такая, что в нескольких нитях один и тот же файл будет читаться параллельно а указатель на позицию в файле - один, рядом с проекцией ( т.е. дескриптор файла открыт один ), следовательно этот указатель будет хаотично меняться: "лебедь, рак и щука" следует для каждой нити использовать уникальный файловый указатель (переменную) и на него опираться при расчете смещения в проекции для операции чтения, так что поддержу скорее xvr p.s.: пока это не будет реализовано, даже гадать не буду что там и как долго, в какой последовательности считывается -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Получить значение shift с помощью SetFilePointer и затем прибавить к lpNumberOfBytesRead? Так заработет? |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
нет, не заработает надо на всякий CreateFile создавать уникальный ресурс, который будет хранить файловый указатель (изначально инициируемый в 0) и указатель на проекцию этого файла а при всяком чтении - обращаться к этому ресурсу, определяя, какая для него текущая позиция, SetFilePointer тут вообще не пригодится, по моему -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Должно быть, я чего-то не понимаю Проекция файла по идее должна кешировать данные между потоками и процессами, но сам файловый описатель не разделяется между процессами (даже при наследовании), а следовательно и файловый указатель. Указанная проблема, на мой взгляд, актуальна лишь в рамках одного процесса, и может быть устранена применением именованного мьютекса... Добавлено @ 10:53
Думаю, это значение потом нужно засунуть обратно в файловый описатель... Это сообщение отредактировал(а) feodorv - 14.5.2012, 10:53 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Скорее всего я что-то не допоминаю... У меня есть спроецированное содержимое файла, т.е. я сначала считал файл, а потом поместил считанные данные в проекцию.
При считывании не с ЖД, мне кажется, что если получить текущую файловую позицию, начиная с неё заполнить буфер, а потом сместить указатель должно заработать. Разве нет? (на мое видение решения проблемы повлиял xvr) |
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
как-то не задумывался, если честно ) как и не особо задумывался над вопросом: "как же тогда MapViewOfFile считывает данные из файла, если не через тот же самый ReadFile?" по моему, если дескриптор отдан в CreateFileMapping то о файловой позиции в нем можно уже забыть, так или иначе, опираться на этот дескриптор для получения позиции бессмысленно
один процесс ничего не знает о проекции и о том, что файл, который он только что открыл, тут же вполне может открть другой процесс, так что мьютекс - конечно хорош, но о том что он нужен при проекции, готовые приложения еще не знают, и не должны знать, по большому счету задача должна быть прозрачной -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Это да. Но у меня такое впечатление, что мы говорим о разном. Если я правильно понял задачу, то freezeman хочет создать разделяемую между процессами именованную файловую проекцию в файле подкачки (то есть даже не связанную с конкретным файлом на диске), в которой будет находится этакая база данных избранных файлов вместе с их содержимым. Содержимое файлов будет грубо скопировано в эту память и никак не привязано к реальным файлам. Перехватываться detours'ом при этом будут запросы на чтение файла в пользовательском режиме (никак не в режиме ядра). А MapViewOfFile вместе с остальной механикой будет ссылаться на системные вызовы, не затрагивая вызов ReadFile с тем же описателем файла. Поэтому все манипуляции пользователя с файловой проекцией того файла, который обслуживается freezeman'ом, пройдут для него незамеченными (мимо изобретаемого им механизма). И никакого указателя... Добавлено через 1 минуту и 14 секунд Мьютекс, конечно, имелся в виду, исключительно в ведении freezeman... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Имменно так)
Это не критично на данный момент, я знаю как обновлять проецированные данные, но пока нужно просто определиться как заполнять буфер. Чтобы при чтении из проекции загружались все требуемые данные. Это сообщение отредактировал(а) freezeman - 14.5.2012, 12:29 |
||||
|
|||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
а зачем в таком случае вообще открывать файл? если все файлы уже в памяти, достаточно просто ресурса, который будет ссылаться на нужную проекцию и все, о файлах можно забыть,правда такое решение уже есть, это RAM-диск я в принципе смотрю по совокупности тем freezeman'а, он же изначально хотел кешировать именно вызовы на чтение данных, а не в целом - файлов выходит так -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Я собирал статистику по обращениям к файлам, затем кэшировал файлы исходя из этой статистики.
Можно подробнее? |
||||
|
|||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Видимо, задача стоИт написать всё самому. Detours - слишком слабое для этой цели средство, но оно доступно, писать соответствующие драйверы не нужно, поэтому и CreateFile, ReadFile и так по порядку... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Это все слишком для моих целей... не успею по срокам, все почти готово, как-то работает, осталось заполнить этот буфер, чтобы чтение происходило) А потом уже все перепишу, если потребуется... |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Угу, но как говорится 'дьявол кроется в деталях' |
|||
|
||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Вот спасибо, вы меня "обрадовали") |
||||
|
|||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Если получить файловую позицию, а после заполнения буфера сместить её с помощью lseek? Так должно работать если не учитывать все описанные детали?
|
|||
|
||||
![]()
|
| Правила форума "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. |