Pergunta

Estou usando objetos distribuídos em meu aplicativo para fornecer comunicação entre um pequeno programa de agente de autenticação e o aplicativo principal. O aplicativo principal gera o Nstask's, que por sua vez invocará o programa de autenticação, que por sua vez ligará de volta ao programa principal para obter algumas credenciais do usuário. Sei que parece complicado, mas precisa funcionar dessa maneira por causa da maneira como o SSH recebe senhas de um programa em ssh_askpath.

No meu aplicativo principal, tenho uma única instância de um objeto chamado PasswordDialog, que eu vendo da seguinte maneira;

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

Isso acontece uma vez quando o aplicativo é iniciado.

No agente de autenticação, ligo de volta para este objeto da seguinte forma;

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

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

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

O problema é que isso não funciona como eu gostaria. Se houver vários agentes de autenticação que executam simultaneamente, acho que todos eles podem acessar o mesmo objeto e chamar o mesmo método simultaneamente. Por exemplo, se eu colocar uma instrução de log no início de "ResponseForpid" e no final, recebo uma saída como essa;

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

O que parece que existem três processos diferentes inserindo meu método no mesmo encadeamento em um objeto com o mesmo endereço. Obviamente, estou perdendo algum entendimento fundamental de objetos e tópicos distribuídos aqui, mas isso parece mágico?

Então, eventualmente eu chego à (s) (s) (s) (s) pergunta (s)

(a) Alguém pode explicar o que está acontecendo aqui (ou seja, como posso obter declarações de log como acima)

(b) Obviamente, estou usando objetos distribuídos incorretamente para minha finalidade. Alguém pode sugerir como eu poderia fazer isso corretamente.

Obrigado e obrigado por ler até o final desta pergunta!


EDIT: Apenas para esclarecer. Meu método "ResponseForpid" se parece com isso;

- (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;

}
Foi útil?

Solução

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>

Os PIDs são todos diferentes, indicando que os threads estão executando em diferentes processos.

Portanto, não, não há acesso simultâneo ao método em um único thread. Que os IDs de threads são os mesmos provavelmente coincidentes; Como os três processos são relativamente simples e iniciam da mesma maneira, os threads são alocados no mesmo endereço em cada um (ou, mais provavelmente, o encadeamento principal está sempre no mesmo endereço por natureza da inicialização do aplicativo).

Tente imprimir [NSThread currentThread] Quando você vomita essas linhas de log e não apenas a string do processo remoto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top