Frage

Ich verwende verteilte Objekte in meiner Anwendung, um die Kommunikation zwischen einem kleinen Authentifizierungsagentenprogramm und der Hauptanwendung bereitzustellen.Die Hauptanwendung erzeugt NSTasks, die wiederum das Authentifizierungsprogramm aufrufen, das wiederum das Hauptprogramm zurückruft, um einige Benutzeranmeldeinformationen abzurufen.Ich weiß, es klingt kompliziert, aber es muss so funktionieren, weil SSH Passwörter von einem Programm in SSH_ASKPATH erhält.

In meiner Hauptanwendung habe ich eine einzelne Instanz eines Objekts namens PasswordDialog, das ich wie folgt verkaufe;

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

Dies geschieht einmalig beim Start der Anwendung.

Im Authentifizierungsagenten rufe ich dieses Objekt wie folgt zurück:

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

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

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

Das Problem ist, dass das nicht so funktioniert, wie ich es gerne hätte.Wenn mehrere Authentifizierungsagenten gleichzeitig ausgeführt werden, können sie meiner Meinung nach alle gleichzeitig auf dasselbe Objekt zugreifen und dieselbe Methode aufrufen.Wenn ich beispielsweise eine Protokollanweisung am Anfang von „responseForPID“ einfüge und am Ende eine Ausgabe wie diese erhalte;

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

Es scheint, als gäbe es drei verschiedene Prozesse, die meine Methode im selben Thread für ein Objekt mit derselben Adresse eingeben.Offensichtlich fehlt mir hier ein grundlegendes Verständnis von verteilten Objekten und Threads, aber das scheint Magie zu sein?

So, irgendwann komme ich zu meiner/n Frage(n)

(a) Kann jemand erklären, was hier vor sich geht (z. B. wie ich Protokollanweisungen wie oben erhalten kann)?

(b) Offensichtlich verwende ich verteilte Objekte falsch für meinen Zweck.Kann mir jemand vorschlagen, wie ich es richtig machen könnte?

Vielen Dank und vielen Dank, dass Sie diese Frage bis zum Ende gelesen haben!


Bearbeiten:Nur um klarzustellen.Meine Methode „responseForPID“ sieht in etwa so aus;

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

}
War es hilfreich?

Lösung

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>

Die PIDs sind alle unterschiedlich, was darauf hinweist, dass die Threads in unterschiedlichen Prozessen ausgeführt werden.

Nein, es gibt keinen gleichzeitigen Zugriff auf die Methode in einem einzelnen Thread.Dass die Thread-IDs identisch sind, ist wahrscheinlich Zufall;Da die drei Prozesse relativ einfach sind und auf die gleiche Weise starten, werden die Threads zufällig jeweils an derselben Adresse zugewiesen (oder, was wahrscheinlicher ist, der Hauptthread befindet sich aufgrund der Art der App-Initialisierung immer an derselben Adresse).

Versuchen Sie es mit Drucken [NSThread currentThread] wenn Sie diese Protokollzeilen ausspucken und nicht nur die Zeichenfolge aus dem Remote-Prozess.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top