Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

CreateFileMapping&MapViewOfFile   Найти похожие ветки 

 
Alexandr_jr   (2005-05-04 07:04) [0]

Добрый день, уважаемые!
Возникла проблема, а именно: необходимо запихать в память динамический массив таким образом, что бы к этой памяти можно было получить доступ из другого преложения. Как работать со статическими структурами я знаю, а вот как вызвать CreateFileMapping для динамической структуры? Как объявлять тип?


 
Digitman ©   (2005-05-04 08:23) [1]

ничего не выйдет из твоей затеи

дин.структуры (в т.ч. и дин.массивы) - это не непрерывные блоки памяти, которые можно было бы отобразить с пом. MMF

кр.того штатное обращение к дин.структурам с целью их модификации (например, SetLength) ведет к обращению к встр.менеджеру памяти, распределяющему/перераспределяющему память под собственно данные дин.структур .. а при перераспределении памяти адреса блоков запросто могут измениться


 
MBo ©   (2005-05-04 08:25) [2]

Не то,что ничего не выйдет, а просто другой подход лучше использовать, без использования встроенных динамических массивов


 
Digitman ©   (2005-05-04 08:31) [3]


> MBo ©   (04.05.05 08:25) [2]


> другой подход лучше использовать, без использования встроенных
> динамических массивов


это же равносильно тому, что совместное полноценное использование дин.структур и MMF реализовать не удастся


 
Alexandr_jr   (2005-05-04 09:06) [4]

Спасибо за отклик. Сам уже понял, что ничего не выйдет.
Может быть тогда посоветуете, как реализовать мою задачу.

Есть абстрактные данные от неких девайсов (тип данных Extended), кроме того присутствует признак качества этих значений (тип byte). Количество устройств постоянно меняется. Необходимо хранить эти данные в общей памяти.
Пока на ум приходит только создать опредененный тип без использования динамических массивов и в зависимости от кол-ва устройств формировать участки памяти...Идентификатором будет выступать имя объекта, т.е. CreateFileMapping(INVALID_HANDLE_VALUE,nil,PAGE_READWRITE,0,SizeOf(F),"Вот это"). Только встает вопрос в том, как преобразовать String в PAnsiChar?


 
Alexandr_jr   (2005-05-04 09:09) [5]

И снова спасибо. Сам разобрался :-)
PChar();

Может быть есть более элегантные решения?


 
Digitman ©   (2005-05-04 09:18) [6]


> неких девайсов


эти дивайсы с random-доступом ? или с последовательным ?


 
Alexandr_jr   (2005-05-04 09:20) [7]


> эти дивайсы с random-доступом ? или с последовательным ?

В каком смысле? Структура приборов описана в нин файле, откуда считывается в динамический массив...Опрос приборов по RS-485 (ModBus) последовательно...Так же последовательно должна производится и запись в память


 
Digitman ©   (2005-05-04 09:46) [8]


> Так же последовательно должна производится и запись в память


а когда объем принятых данных превысит размер MMF-блока, что будешь делать ?


 
Alexandr_jr   (2005-05-04 09:58) [9]


> а когда объем принятых данных превысит размер MMF-блока,
> что будешь делать ?

Гыыы :-) Есть 99% гарантия, что не превысят. Я пишу не архив, а лишь текущие значения. Количества приборов обычно не превышает 20 штук, а это 10 байт*(8 текущих значений+8 признаков качества)*20 устройств = не более 5 килобайт :-)


 
Digitman ©   (2005-05-04 10:16) [10]

т.е. ты хочешь реализовать некую подобную схему :

стартует процесс A, осуществляющий инф.обмен с одним или более дивайсами

для каждого активного дивайса процесс А создает отдельный MMF заведомо определенного размера и извещает (тем или иным образом) прочие заинтересованные процессы (В, С, ..) о создании этого MMF

получившие извещения процессы (В, С, ..) со своей стороны открывают эти MМF дабы иметь возможность чтения данных, записываемых процессом А в соответствующие MMF

так ?


 
Alexandr_jr   (2005-05-04 10:20) [11]

Точна!


 
Digitman ©   (2005-05-04 10:28) [12]

а как ты намерен извещать процессы (В, С, ..) о создании/модификации содержимого/уничтожении того или иного MMF ?


 
Alexandr_jr   (2005-05-04 10:31) [13]


> а как ты намерен извещать процессы (В, С, ..) о создании/модификации
> содержимого/уничтожении того или иного MMF ?

Они буду собирать конфигурацию оборудования из того же ini файла, что и я...


 
Alexandr_jr   (2005-05-04 10:32) [14]

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


 
evvcom ©   (2005-05-04 10:36) [15]

Я как-то разбирался с одной реализацией подобного. Там было сделано примерно так:
Создается командный канал: по одному объекту FileMapping, Mutex и Event с заранее известными именами. Через этот канал сообщается о создании/удалении каналов данных, их имен и т.п. Соответственно создаются каналы передачи данных (те же FileMapping, Mutex и Event), ну и через них гонят сами данные.


 
Digitman ©   (2005-05-04 10:38) [16]


> Alexandr_jr   (04.05.05 10:31) [13]


неразумно это

зачем им, прочим процессам, нужно знать конфигурацию оборудования, если непосредственно с оборудованием работатает некий "главный" процесс А, а все что нужно знать этим прочим процессам - это факт активности/неактивности такого-то дивайса с таким-то именем и факт поступления данных от этого дивайса ?


 
evvcom ©   (2005-05-04 10:39) [17]

Кстати, если структура относительно постоянна, то вполне можно обойтись и одним подобным каналом.


 
Digitman ©   (2005-05-04 10:40) [18]


> Alexandr_jr


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


 
Alexandr_jr   (2005-05-04 10:44) [19]


> гораздо разумней (эффективней и, если угодно, элегантней)
> будет использование именованых программных каналов для коммуникации
> процесса А (сервера) с прочими процессами (клиентами сервера)

Скорее всего так и поступлю...Просто головным процессам всё равно придется держать у себя в памяти все настройки...
А мое приложение лишь использует их часть...

Всем огромное спасибо!


 
alpet ©   (2005-05-04 10:47) [20]

Если нужна совместимость с Win9x можно использовать сообщения. Для этого в общей памяти должен быть список (массив) идентификаторов потоков клиентов, которым должны отправляться уведомления от основного процесса. В конечных потоках сообщения есстно должны обрабатываться. Я в своей программе использую нечто подобное.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.067 c
14-1117563162
гогениус
2005-05-31 22:12
2005.06.29
ищу работу. с обучением. за копейки. Питер


1-1118127057
-=snoop=-
2005-06-07 10:50
2005.06.29
добавление объекта на форму через код....


1-1117793065
Andrey Kononov
2005-06-03 14:04
2005.06.29
Передача параметров в форму


4-1115042621
Rambo
2005-05-02 18:03
2005.06.29
Права доступа


4-1114998618
n0name
2005-05-02 05:50
2005.06.29
Зачем нужен линковщик?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский