Передача указателя на объект в дочернее приложение - PullRequest
0 голосов
/ 21 июля 2010

A tiny pointer problem :)

Так что в принципе у меня есть два приложения. Приложение 1 запускает Приложение 2 , но оно остается в памяти. Когда Приложение 2 запущено, ему нужно дать указатель на объект CALayer , который хранится в первом приложении. Объект, представленный указателем, должен быть доступен обоим приложениям. Я использую Objective-C . Буду очень признателен за примеры .

Мне нужно что-то более кроссплатформенное и Распределенные объекты Mac OS X . И я не знаю, что CALayer специфичен для Mac ( хорошо из-за iOS ). Я знаю это чертовски хорошо, просто я хочу использовать кроссплатформенное решение вместо конкретного.

Ответы [ 4 ]

2 голосов
/ 21 июля 2010

Вы не сможете передавать указатель через границы приложения, поскольку процессы будут иметь разные адресные пространства.Если вам нужно обратиться к этому объекту и инициировать операции с ним, вам нужно будет использовать распределенную объектную систему или другой уровень межпроцессного взаимодействия.

У меня сложилось впечатление, что вы хотите порождать дочерний процесс, имейте этообновить некоторую общую структуру данных и затем выйти.Одной из возможностей может быть использование системы с общей памятью, например mmap (2) или System V совместно используемой памяти .К сожалению, переносимая общая память в Windows и Unix / Linux немного сложнее, и вам, вероятно, придется создать некоторые обертки для конкретной платформы. Эта статья MSDN должна дать вам стартовое представление о mmap-подобном средстве в Windows, но я никогда не делал общую память на этой платформе, поэтому я не могу поручиться за любые входы и выходы.

Другой возможностью было бы сериализовать объект и передать сериализованную структуру данных между процессами с помощью конвейера или другого механизма.Опять же, делать это портативно несколько чревато, поскольку IPC в Unix и Windows работает совершенно по-разному.

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

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

Кроме того, повышайте безопасность файлов, используемых для mmap, если вы решите использовать это.

1 голос
/ 21 июля 2010

использование распространение объекта в Mac OS X, с концепцией распространения объекта вы можете совместно использовать свой объект CALayer между Application1 и Aplication2

0 голосов
/ 21 июля 2010

Переносимый способ обмена данными между приложениями - использование межпроцессного взаимодействия. В данном случае это общая память. API-интерфейсы POSIX и System V доступны в Mac OS X.

Некоторые ссылки можно найти в Альтернативы уведомлениям раздел Обзор уведомлений документ.

0 голосов
/ 21 июля 2010

Не существует переносимого (кроссплатформенного) способа передачи указателей между процессами (приложениями). Портативно, процессы могут обмениваться сериализацией объектов, используя сетевые соединения или файлы.

...