代码之家  ›  专栏  ›  技术社区  ›  Ira Cooke

使用分布式对象自动生成对象并同步访问

  •  1
  • Ira Cooke  · 技术社区  · 15 年前

    我在应用程序中使用分布式对象来提供微型身份验证代理程序和主应用程序之间的通信。主应用程序生成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;
    
    }
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   bbum    15 年前
    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] 当您从远程进程中,而不仅仅是字符串中的日志行时。