2012-02-15 6 views
4

Mac OS X LionのCARemoteLayerServerおよびCARemoteLayerClientがQuartzCoreに追加されました。私は、それらが複数のプロセス間でグラフィカルアプリケーションを分割するのに適しているかどうかを調査しようとしていましたが、成功しませんでした。いいですプロセス間でCARMoteLayerServerとCARemoteLayerClientを使用できますか?

- (void)buildLayerSingleProcess 
{ 
    CARemoteLayerServer *server = [CARemoteLayerServer sharedServer]; 

    self.client = [[CARemoteLayerClient alloc] initWithServerPort: server.serverPort];  
    uint32_t clientID = self.client.clientId;  

    CALayer *layer1 = [CALayer layer]; 
    layer1.bounds = CGRectMake(0.0, 0.0, 100.0, 100.0); 

    CGColorRef color = CGColorCreateGenericRGB(0.4, 0.2, 0.3, 1.0); 
    [layer1 setBackgroundColor: color]; 
    CFRelease(color); 

    [layer1 setOpacity: 0.75]; 
    [layer1 setBorderWidth: 5.0f]; 

    layer1.position = CGPointMake([[self.window contentView] frame].size.width/2.0, [[self.window contentView] frame ].size.height/2.0); 

    self.client.layer = layer2; 

    CALayer *servedLayer = [CALayer layerWithRemoteClientId: self.client.clientId];  
    [[[self.window contentView] layer] addSublayer: servedLayer]; 
} 

を、私は試してみて、プロセス間の類似した何かをしたいと思います:

私はこの線に沿っていくつかのコードを、単一プロセス内に成功し、それらを使用することができます。 server.serverPortがmach_port_t型であるということは、プロセス間での使用に適していることを意味します。

しかし、2つのプロセス(2つの個別のアプリケーションまたはメインプロセスとXPCサービス)でそのコードを分割すると、他のプロセスのサーバーからmach_port_tを使用してCARemoteLayerClientを初期化しようとすると私は:

unable to register with server: 0x10000003 

ランダムプロセスの間には適していないかもしれませんが、mach_port_tちゃんの使用はそのことを意味します。

他の誰もプロセス間でこれらのクラスを使用して成功しましたか?

答えて

4

はい、可能です。次に例を示します:https://github.com/krevis/RemoteLayerDemo

「リモートレイヤーを取得する」ボタンを押すと、サービスが開始され、アプリケーションは緑色のリモートレイヤーになります。 (奇妙なことに、何秒かかかります - 理由はわかりません)

その後、 "Change Color"ボタンを押すと、レイヤーの色を変更するようにメッセージが送信されます。アニメート。 「Remove Remote Layer」ボタンはレイヤーを削除します。数秒間アイドル状態にすると、サービスは終了します。

ハード部分がプロセス間でCARemoteLayerServerのMachポートを通過しています。あなたのプロセスで見るmach_port_tは単なる数字です。それはあなたのプロセス内でのみ意味を持っています。 (ポインターと同じ考え:ポインターは数字ですが、あるプロセスから別のプロセスへポインターを渡すことはできず、同じものを指し示すことはできません)

XPCはMachポートしかし、それはできません。これはずっと簡単になるでしょう!

代わりに、マッハAPIを使用して基礎となるMachポートを送信する必要があります。デモでは、私はbootstrap_registerをアプリに、bootstrap_look_upを同意した名前で使用しています。同じブートストラップコンテキスト内の他のアプリケーションがポートを見つけることができるため、これは安全ではありませんが、デモ用には十分です。実際にはdive down to some uglier Mach callsにしたいと思っています。

+0

多くのありがとう、特に作業デモでは、非常に素晴らしいです。私はmachポートがソケットポート(あなたが回ることができる)のように働くことに関して悪い仮定をしていました。明らかに私はInternalsの本とより多くの時間を費やす必要があります! – Michael

+0

だけで疲れてデモは、もはや作品 - Xcodeの7.2 - OSX 10.11.2 – Jimmy

+0

修正がここで説明されて - https://github.com/krevis/RemoteLayerDemo/issues/2リマインダー用 – Jimmy

関連する問題