2010-07-21 3 views
0

A tiny pointer problem :)Le passage d'un pointeur vers un objet sur une application enfant

Donc, fondamentalement, j'ai deux applications. Application 1 lance Application 2 mais reste en mémoire. Lorsque L'application 2 est démarrée, un pointeur doit être donné à l'objet CALayer qui est stocké dans la première application. L'objet représenté par le pointeur doit être accessible par les deux applications. J'utilise Objective-C. J'apprécierais vraiment tous les exemples .

J'ai besoin quelque chose de plus multiplateforme et objets distribués sont Mac OS X spécifique. Et ce n'est pas une question de moi ne sachant pas que CALayer sont spécifiques à Mac (bien à cause de iOS). Je sais très bien, c'est juste que je veux utiliser une solution multiplateforme au lieu d'une solution spécifique.

Répondre

2

Vous ne pourrez pas passer un pointeur entre les limites d'une application car les processus auront des espaces d'adressage différents. Si vous devez vous référer à cet objet et initier des opérations contre celui-ci, vous devrez utiliser un système objet distribué ou une autre couche de communication interprocessus. L'impression que j'obtiens est que vous voulez engendrer le processus fils, lui faire mettre à jour une structure de données partagée et ensuite quitter. Une possibilité serait d'utiliser un système de mémoire partagée tel que mmap (2) ou System V shared memory. Malheureusement, la mémoire partagée portable est un peu plus difficile à atteindre sur Windows et Unix/Linux, et vous devrez probablement créer des wrappers spécifiques à la plate-forme. This MSDN article devrait vous donner un démarreur sur une installation de type mmap sur Windows, mais je n'ai jamais fait de mémoire partagée sur cette plate-forme, donc je ne peux pas vraiment me porter garant pour les tenants et les aboutissants.

Une autre possibilité consisterait à sérialiser l'objet et à passer la structure de données sérialisée entre les processus avec un canal ou un autre mécanisme. Encore une fois, le faire de manière portable est un peu compliqué car IPC sous Unix et Windows fonctionne de manière très différente.

Notez qu'avec la mémoire partagée, l'objet devra être initialisé dans le pool de mémoire partagée, ce qui signifie qu'il devra d'abord être alloué. Sinon, vous devrez copier les données dans et hors du pool partagé explicitement. Si la structure de données contient des pointeurs, alors ce mouvement casse les pointeurs. Ce dernier point signifie également que le processus fils parent ahd devra également mapper la mémoire partagée dans la même adresse virtuelle si vous avez l'intention de suivre des pointeurs dans la structure de données partagée. L'alternative si vous avez besoin de références dans la structure de données est de les implémenter comme des poignées ou des offsets d'une base. Cela compliquera le code qui construit votre structure de données afin de mapper à la même adresse afin que vous puissiez utiliser les pointeurs est une victoire.

Également swot sur la sécurité des fichiers utilisés pour mmap si vous décidez de l'utiliser.

+0

Pourriez-vous donner un exemple d'utilisation de la mémoire partagée sur Max OS X? –

+0

Sur n'importe quel système dérivé d'unix, recherchez mmap (2) qui vous permet de mapper un fichier dans la mémoire virtuelle. Cela fonctionnera sur OSX, Unix, Linux, etc. mais ce n'est pas portable pour Windows. Vous devriez écrire des wrappers pour le faire sous Unix/Windows. Faites d'abord appel à mmap sur OSX et voyez s'il fait ce que vous voulez. Une autre API qui fera cela est la mémoire partagée System V. Essayez googling pour "mémoire partagée du système V". Je suppose que OSX supporte SYSV shmem mais je ne suis pas sûr de la tête. – ConcernedOfTunbridgeWells

1

utilisation distribute object sous Mac OS X, avec distribution de concept d'objet que vous pouvez partager votre objet CALayer entre Application1 et Aplication2

+0

J'ai besoin de quelque chose de plus semblable à C. Pas quelque chose de trop spécifique à la plateforme. –

+2

@Nick Vous voulez quelque chose de neutre sur la plate-forme, mais vous utilisez 'CALayer'? Vous ne comprenez apparemment pas ce que vous demandez. 'CALayer' n'existe que dans les frameworks Cocoa/Cocoa-Touch. –

+0

En fait, je le sais. CALayer était un exemple général. –

0

Il n'y a aucun moyen portable (multi-plateforme) pour passer des pointeurs entre les processus (applications). Portably, les processus peuvent échanger des sérialisations d'objets en utilisant des connexions réseau ou des fichiers.

0

Une manière portable de partager des données entre applications consiste à utiliser la communication inter-processus. Dans ce cas, c'est de la mémoire partagée. Les API POSIX et System V sont disponibles sur Mac OS X.

Certains liens peuvent être trouvés dans la section Alternatives to Notifications de Présentation de la notification document.

Questions connexes