Форум: "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.043 c