Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Win API


Информационный Канал Subscribe.Ru


RusFAQ.ru: Win API

Выпуск № 071
от 19.05.2004, 23:10

Администратор:
Имя: Калашников О. А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 177
Отправлено ответов: 281
Активность: 158.7 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Gibbel
Статус: Профессиональный
Общий рейтинг: 105.48
URL: Savage Metal Club - жизнь в стиле рок-н-ролл
Телефон: +7 901 710 3146
[Подробней >>]
Pawel
Статус: Профессиональный
Общий рейтинг: 155.66
[Подробней >>]
Foamplast
Статус: Профессиональный
Общий рейтинг: 151.08
URL: мой личный сайт
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 176. В Total (Windows) Commander есть плагин Lister, который открывает текстовые файлы для просмотра (реж... (ответов: 3)

Вопросов: 1, ответов: 3


 Вопрос № 176

В Total (Windows) Commander есть плагин Lister, который открывает текстовые файлы для просмотра (режим read only), причем за время не более 1-ой секунды!. Особенность его в том, что размер файла не имеет значения - хоть 1 килобайт, хоть 3 _мегабайта_.
Вопрос в чем: мне нужно тоже сделать такую штуку: read only-просмотр содержимого файла на форме (например, в TMemo /Borland C++ Builder v 5/). Суть в том, что это должно очень быстро грузиться. Естественно, стандартным LoadFromFile тут не обойтись. Помогите, пожалуйста (может, кто сталкивался с такой задачей - может есть исходники)..



Вопрос отправлен: 14.05.2004, 02:17
Отправитель: Alexey

[Следующий вопрос >>] [Список вопросов]

Отвечает Gibbel

Добрый день, Alexey!
Копай MSDN в сторону File Mapping.

Ответ отправлен: 14.05.2004, 09:47
Отправитель: Gibbel


Отвечает Pawel

Приветствую Вас, Alexey!
Читаются первые N символов которые влазят в экран.
Далее при прокрутке данные дочитываются.

Ответ отправлен: 15.05.2004, 20:55
Отправитель: Pawel


Отвечает Foamplast

Приветствую Вас, Alexey!

Есть такой метод: отображение файлов на память. То есть программа делает соответствующие вызовы, и после этого некоторая порция адресного пространства программы начинает соответствовать указанному файлу. Положим, отображение начинается с адреса 100, тогда чтение из памяти по адресу [102] равносильно чтению из файла по смещению 2. А запись в память по адресу [211] равносильно записи в файл по смещению 111.

на диске
...bigfile.dat...
 ax 
 030 
 
в памяти
...codedata...mapping area...
     ax 
 4000050000 6000060030 

Вся прелесть этого метода состоит в том, что операционная система делает всю работу по чтению/записи в файл. То есть программист может сосредоточиться на более высокоуровневых задачах. Например, при чтении из 60-го мегабайта файла система просто загрузит страницу памяти данными из соответствующей области файла. При этом реально передано будет немного даных (скорее всего, около 4Кб). Для использования отображения на память в Windows используются следующие функции:

CreateFile() - открывает файл для чтения/записи
CreateFileMapping()    - создаёт объект "отображённый на память файл"
MapViewOfFile() - отображает заданный участок файла на память
UnmapViewOfFile() - прекращает отображение участка файла на память
CloseHandle() - закрывает объект "отображённый на память файл"
CloseHandle() - закрывает файл

Слова "отображает заданный участок" в описании MapViewOfFile() не случайны. При вызове этой функции указывается, что, например, отображать стоит только участок с 6291456-го байта по 7528448-й. Естественно, значения начала и конца отображения должны быть кратны размеру блока памяти в системе, который можно узнать с помощью GetSystemInfo().

Возвращаясь к нашим (точнее, Вашим) баранам, хочу сказать, что имеет смысл использовать именно этот метод. Только что открыл файл в 690 Мб за полсекунды. Прикол в том, что программа реально обращалась к первым 512 байтам. Но отображала весь файл! То есть чтение из конца этого файла займёт, наверное, тоже немного. Проверьте это.

Только что отладил Windows Commander. Нифига он не использует отображение на память! Он просто читает файл блоками ~32 Кбайт. Когда подходит конец блока, он читает следующий. То есть для реализации этого метода необходимо всего два буфера. В одном хранится то, что показывается, а в другом - что покажется следующим (при достижении границы). Конечно же, при изменении направления движения необходимо перезагрузить "предварительный" буфер. В целом, это и есть работа ОС при последовательном чтении отображённой на файл памяти. :)

Вывод: отображение файлов целиком проще, но при "обычном" чтении задержка меньше.




Ответ отправлен: 16.05.2004, 02:03
Отправитель: Foamplast



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (24)
C / C++ (14)
Perl (2)
Builder / Delphi (16)
Pascal (18)
Basic / VBA (2)
Java / JavaScript (3)
PHP (11)
Криптография (5)
WinAPI (7)
Радиоэлектроника (5)
Пользователю
Windows 95/98/Me (36)
Windows NT/2000/XP (50)
"Железо" (28)
Поиск информации (15)
Администратору
Windows NT/2000/XP (24)
Linux / Unix (8)
Юристу
Гражданское право (9)
Семейное право (7)
Трудовое право (8)
КоАП (6)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное