gpt4 book ai didi

cocoa - 使用分布式对象出售对象并同步访问

转载 作者:行者123 更新时间:2023-12-03 17:18:04 28 4
gpt4 key购买 nike

我在应用程序中使用分布式对象来提供小型身份验证代理程序和主应用程序之间的通信。主应用程序生成 NSTask,后者将调用身份验证程序,而身份验证程序又将回调主程序以获取一些用户凭据。我知道这听起来很复杂,但它必须以这种方式工作,因为 ssh 从 SSH_ASKPATH 中的程序获取密码的方式。

在我的主应用程序中,我有一个名为“PasswordDialog”的对象的单个实例,我按如下方式提供该对象;

PasswordDialog *vendedPasswordDialog=[[PasswordDialog alloc] init];  
[[NSConnection defaultConnection] setRootObject:vendedPasswordDialog];
[[NSConnection defaultConnection] registerName:@"MyConnectionName"]

应用程序启动时会发生一次。

在身份验证代理中,我按如下方式回调该对象;

NSConnection *passwordDialogConnection = [NSConnection connectionWithRegisteredName:@"MyConnectionName" host:nil];

PasswordDialog *pdProxy = (PasswordDialog*)[passwordDialogConnection rootProxy];

NSString *responseStr = [pdProxy responseForPID:pidString host:hostnameString user:usernameString processInfo:[NSProcessInfo processInfo]];

问题是这并不像我想要的那样工作。如果有多个身份验证代理同时执行,我发现它们都可以访问同一对象并同时调用同一方法。例如,如果我在“responseForPID”的开头放置一条日志语句,最后我会得到这样的输出;

beginMethod PID 3618848 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
beginMethod PID 4882384 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
beginMethod PID 4872848 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>

PID endMethod 4872848
PID endMethod 4882384
PID endMethod 3618848

这似乎有三个不同的进程在具有相同地址的对象的同一线程上进入我的方法。显然,我在这里缺少对分布式对象和线程的一些基本理解,但这看起来很神奇?

所以最终我回答了我的问题

(a)有人可以解释一下这里发生了什么(即我如何获得上面的日志语句)

(b) 显然,我错误地使用了分布式对象来达到我的目的。谁能建议我如何正确地做到这一点。

感谢您阅读到本问题的结尾!

<小时/>

编辑:只是为了澄清。我的“responseForPID”方法看起来像这样;

- (NSString*) responseForPID:(NSString*) pid host:(NSString*)hostname user:(NSString*) username processInfo:(NSProcessInfo*) info {

NSLog(@"beginMethod PID %@ on thread %@ for object %@",pid,[NSThread currentThread],self);

.... code to get the password

NSLog(@"PID endMethod %@",pid);
return passwordString;

}

最佳答案

beginMethod PID 3618848 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
beginMethod PID 4882384 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>
beginMethod PID 4872848 on thread <NSThread: 0x30b050>{name = (null), num = 1} for object <PasswordDialog: 0x485460>

PID都不一样,说明线程在不同的进程中执行。

所以,不,不能在单个线程上同时访问该方法。线程 ID 相同可能是巧合;由于这三个进程相对简单并且启动方式相同,因此线程恰好分配在每个进程中的相同地址(或者更可能的是,由于应用程序初始化的性质,主线程始终位于相同的地址)。

当您输出这些日志行而不仅仅是来自远程进程的字符串时,请尝试打印[NSThread currentThread]

关于cocoa - 使用分布式对象出售对象并同步访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1481453/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com