Вверх ↑
Разработчик
Ответов: 26170
Рейтинг: 2127
#1: 2008-07-05 14:30:46 ЛС | профиль | цитата
tsdima писал(а):
опционально - сохранение этого дела в файле, т.е. чтобы содержимое не потерялось от запуска к запуску

Содержимое не теряется от запуска к запуску, пока не закрою проекцию файла, хоть тыщу раз запускай.

tsdima писал(а):
Мютексы никаким боком не стоят вместе с обработкой сообщений

А где это ты видел, что бы я это писал
Вопрос был задан вот на это
Galkov писал(а):
Послать сигнал, это Events.doSet, дождаться сигнала - WaitObject.doWait


tsdima писал(а):
Тут надо транзакциями работать, т.е. после начала транзакции ты имеешь либо данные до начала транзакции, либо тобой записанные, и вмешательства извне исключены

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

------------ Дoбавленo:


Что мне больше всего понравилось, так это то, что можно передавать не сами данные а указатели на эти данные (колоссальная экономия времени), совершенно не заботясь о их сохранности, система сама сделает все, что надо. Есть, правда, один маленький недостаток -- ограничение, связанное с отведенным под файловые операции размером буфера

------------ Дoбавленo:


tsdima писал(а):
либо с виртуальным файлом, если имя файла не задано

Ему все равно имя и класс нужно присвоить и к нему обращаться по его имени или классу

------------ Дoбавленo:


Все хорошо, но вот зачем нам это нужно для файлов, я не понимаю, особенно для больших -- никакой выгоды не получается. Читаем Рихтера (пример одного алгоритма)

Рихтер писал(а):
Этот алгоритм проецирует представления по 64 Кб (в соответствии с гранулярностью выделения памяти) или менее. Кроме того, функция MapViewOfFile требует, чтобы передаваемое ей смещение в файле тоже было кратно гранулярности выделения памяти. Подпрограмма проецирует на адресное пространство сначала одно представление, подсчитывает в нем количество нулей, затем переходит к другому представлению, и все повторяется. Спроецировав и просмотрев все 64-килобайтовые блоки, подпрограмма закрывает объект "проекция файла".


и перед самим примером

Рихтер писал(а):
Я обещал рассказать, как спроецировать на небольшое адресное просранство файл длиной 16 экзабайтов. Так вот, этого сделать нельзя. Вам придется проецировать не весь файл, а его представление, содержащее лишь некую часть данных. Вы начнете с того, что спроецируете представление самого начала файла. Закончив обработку данных в этом представлении, Вы отключите его и спроецируете представление следующей части файла — и так до тех пор, пока не будет обработан весь файл. Конечно, это делает работу с большими файлами, проецируемыми в память, не слишком удобной, но утешимся тем, что длина большинства файлов достаточно мала


Какую от всего этого мы получим выгоду Я хотел использовать эту фичу для обмена данными между приложениями, блоками по размеру меньше гранулярности (до 64 кб), и совершенно не для физических файлов, те именно создать простой сервер/клиент по типу PIPE, но гораздо проще и не зависящий от передачи оконных сообщений

------------ Дoбавленo:


Вот, что я хотел сделать применительно к HiAsm'y

Рихтер писал(а):
Эта программа, "17 MMFShare.exe" (см. листинг на рис. 17-3), демонстрирует, как происходит обмен данными между двумя и более процессами с помощью файлов, проецируемых в память. Файлы исходного кода и ресурсов этой программы находятся в каталоге 17-MMFShare на компакт-диске, прилагаемом к книге.

Чтобы понаблюдать за происходящим, нужно запустить минимум две копии MMFShare. Каждый экземпляр программы создаст свое диалоговое окно.

Чтобы переслать данные из одной копии MMFShare в другую, наберите какой нибудь текст в поле Data. Затем щелкните кнопку Create Mapping Of Data. Программа вызовет функцию CreateFileMapping, чтобы создать объект "проекция файла" размером 4 Кб и присвоить ему имя MMFSharedData (ресурсы выделяются объекту из страничного файла). Увидев, что объект с таким именем уже существует, программа выдаст сообщение, что не может создать объект. А если такого объекта нет, программа создаст объект, спроецирует представление файла на адресное пространство процесса и скопирует данные из поля Data в проецируемый файл.

Далее MMFShare прекратит проецировать представление файла, отключит кнопку Create Mapping Of Data и активизирует кнопку Close Mapping Of Data. На этот момент проецируемый в память файл с именем MMFSharedData будет просто "сидеть" где-то в системе. Никакие процессы пока не проецируют представление на данные, содержащиеся в файле.

Если Вы теперь перейдете в другую копию MMFShare и щелкнете там кнопку Open Mapping And Get Data, программа попытается найти объект "проекция файла" с именем MMFSharedData через функцию OpenFileMapping, Если ей не удастся найти объект с таким именем, программа выдаст соответствующее сообщение. В ином случае она спроецирует представление объекта на адресное пространство своего процесса и скопирует данные из проецируемого файла в поле Data. Вот и все! Вы переслали данные из одного процесса в другой

Кнопка Close Mapping Of Data служит для закрытия объекта "проекция файла", что высвобождает физическую память, занимаемую им в страничном файле. Если же объект "проекция файла" не существует, никакой другой экземпляр программы MMFShare не сможет открыть зтот объект и получить от него данные. Кроме того, если один экземпляр программы создал объект "проекция файла", то остальным повторить его создание и тем самым перезаписать данные, содержащиеся в файле, уже не удастся.

карма: 22

0