tsdima писал(а):
опционально - сохранение этого дела в файле, т.е. чтобы содержимое не потерялось от запуска к запускуСодержимое не теряется от запуска к запуску, пока не закрою проекцию файла, хоть тыщу раз запускай.
tsdima писал(а):
Мютексы никаким боком не стоят вместе с обработкой сообщенийА где это ты видел, что бы я это писал
Вопрос был задан вот на это
Galkov писал(а):
Послать сигнал, это Events.doSet, дождаться сигнала - WaitObject.doWaittsdima писал(а):
Тут надо транзакциями работать, т.е. после начала транзакции ты имеешь либо данные до начала транзакции, либо тобой записанные, и вмешательства извне исключеныНу это дело к мютексам каким боком относится. Когда мы открываем файл для работы, что мы то и дело мьютексы и транзакции лепим, да нифига подобного, система сама расшаривает ресурс, флаги для этого есть специальные
------------ Д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 не сможет открыть зтот объект и получить от него данные. Кроме того, если один экземпляр программы создал объект "проекция файла", то остальным повторить его создание и тем самым перезаписать данные, содержащиеся в файле, уже не удастся.