Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.111.125] |
|
Сообщ.
#1
,
|
|
|
Можно ли и как организовать общее адресное пространство для разных приложений (процессов) без использования СУБД и без передачи всего массива данных?
Например, одно приложение обновляет большой массив данных, а другое "на лету" их использует. Спасибо. |
Сообщ.
#2
,
|
|
|
Сообщ.
#3
,
|
|
|
Спасибо, shm, искал по разному, но не догадался посмотреть сочетание "разделяемая память".
|
Сообщ.
#4
,
|
|
|
Сообщ.
#5
,
|
|
|
Цитата JoeUser @ Хотел бы попроще, тем более, сеть не нужна, все процессы - на одном клиенте.Почтовые ячейки Нашёл, что: "В Windows существует два способа создания разделяемой секции памяти. Программист может поместить часть глобальных переменных приложения в отдельную секцию данных и установить атрибут “shared” для неё. Для этого используются директива “#pragma section” или параметр командной строки сборщика “/SECTION”. В результате единственная копия помеченных переменных будут использоваться всеми процессами, загрузившими .exe или .dll. Второй способ предполагает использование функций CreateFileMapping, MapViewOfFileEx и прочих." Первый способ, кажется, самым простым, правда, пока не нашёл, как им пользоваться. |
Сообщ.
#6
,
|
|
|
Для тебя подходит вариант #2. Для не освоивших гугл прилагаю пример на сайте мелкомягких.
|
Сообщ.
#7
,
|
|
|
Цитата shm @ Про FileMapping слышал и посматривал давно. Перед тем как копать в эту (или другую) сторону, хотел бы всё-таки уточнить свою задачу:Для тебя подходит вариант #2 есть динамический массив структур, который с каким-то шагом по времени меняется как по значению данных, так и по длине в одном приложении (процессе). Другому приложению, хочу передавать только адрес начала массива и его длину, по которым он, например, строит графики. Могу я использовать FileMapping таким образом на "живом" массиве без копирования данных? |
Сообщ.
#8
,
|
|
|
Цитата vlad2 @ "живом" массиве без копирования данных? Можешь. |
Сообщ.
#9
,
|
|
|
Цитата shm @ Всё-таки мне придётся постоянно копировать (CopyMemory) большой массив по адресу, полученному от MapViewOfFile.Можешь. Мои данные - это массив объектов класса, в который, в том числе, входит массив структур. И эти данные я вынужден постоянно копировать, вместо того, чтобы просто передать адрес начала моего массива другому процессу, что, конечно, невозможно, т.к. он в другом адресном пространстве (. |
Сообщ.
#10
,
|
|
|
Цитата vlad2 @ Всё-таки мне придётся постоянно копировать (CopyMemory) большой массив по адресу, полученному от MapViewOfFile. А что мешает прямо писать по адресу, который получен от MapViewOfFile? |
Сообщ.
#11
,
|
|
|
Цитата shm @ Да я думал, но не очень представляю, как это сделать. А что мешает прямо писать по адресу, который получен от MapViewOfFile? Допустим, размещу по этому адресу объекты класса. Но в классе, в числе других переменных, содержится адрес массива структур, и размер этого массива всё время разный. Как быть с этим? |
Сообщ.
#12
,
|
|
|
Цитата vlad2 @ И эти данные я вынужден постоянно копировать, вместо того, чтобы просто передать адрес начала моего массива другому процессу, что, конечно, невозможно, т.к. он в другом адресном пространстве (. Посмотри тут |
Сообщ.
#13
,
|
|
|
Цитата ЫукпШ @ Спасибо, я этого не знал.Посмотри тут Правда сразу же возник вопрос: что значит, что "область, которая читается, должна быть доступна" (area to be read must be accessible)? А от копирования и здесь не избавиться: "ReadProcessMemory копирует данные в заданном адресе, в диапазоне от адресного пространства указанного процесса в заданный определенный буфер текущего процесса". Но всё равно посмотреть в эту сторону стоит. |
Сообщ.
#14
,
|
|
|
Цитата vlad2 @ Правда сразу же возник вопрос: что значит, что "область, которая читается, должна быть доступна" (area to be read must be accessible)? Посмотри это. |
Сообщ.
#15
,
|
|
|
Цитата ЫукпШ @ Посмотри тут Из пушки по воробьям. ИМХО. Добавлено Цитата vlad2 @ содержится адрес массива структур, и размер этого массива всё время разный. Как быть с этим? Шо мешает массив структур тоже там же разместить сразу за классом? Добавлено Ну и это самое. Не стоит рассчитывать на валидность указателей в другом адресном пространстве. Области виртуальной памяти отображенные на разделяемую память в них будут отличаться, так что серилизация данных в той или иной степени нужна. |
Сообщ.
#16
,
|
|
|
К сожалению, оказалось, что создание дочернего процесса не решает моей проблемы, поэтому вопрос моего поста пока потерял актуальность.
Но всё равно обсуждение было очень полезным и его результаты наверняка потребуются потом. Спасибо. |