2010-07-21 5 views
0

A tiny pointer problem :)Передача указателя на объект на ребенок приложение

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

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

ответ

2

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

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

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

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

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

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

+0

Не могли бы вы привести пример использования общей памяти на Max OS X? –

+0

В любой системе, полученной из unix, найдите mmap (2), который позволяет отображать файл в виртуальную память. Это будет работать на OSX, Unix, Linux и т. Д., Но оно не переносится в Windows. Вам придется писать обертки, чтобы сделать это в Unix/Windows. Сначала возьмите mmap, работая на OSX, и посмотрите, делает ли он то, что вы хотите. Другим API, который будет делать это, является общая память System V. Попробуйте googling для «System V shared memory». Я предполагаю, что OSX поддерживает SYSV shmem, но я не уверен в своей голове. – ConcernedOfTunbridgeWells

1

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

+0

Мне нужно что-то более C-like. Не что-то слишком специфичное для платформы. –

+2

@Nick Вы хотите, чтобы какая-то платформа была нейтральной, но вы используете 'CALayer'? Вы, по-видимому, не понимаете, о чем вы просите. 'CALayer' существует только в рамках Cocoa/Cocoa-Touch. –

+0

На самом деле, я это знаю. CALayer был общим примером. –

0

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

0

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

Некоторые ссылки можно найти в разделе Alternatives to Notifications раздела Уведомление об обзоре документ.

Смежные вопросы