2012-12-19 11 views
6

Ho bisogno di realizzare una comunicazione tra due thread usando i canali NSPipe, il problema è che non ho bisogno di chiamare il comando terminale specificando questi metodi.Comunicazione tra processo usando NSPipe, NSTask

[task setCurrentDirectoryPath:@"....."]; 
[task setArguments:]; 

Ho solo bisogno di scrivere alcuni dati

NSString * message = @"Hello World"; 
[stdinHandle writeData:[message dataUsingEncoding:NSUTF8StringEncoding]]; 

e dall'altro filo di ricevere questo messaggio

 NSData *stdOutData = [reader availableData]; 
NSString * message = [NSString stringWithUTF8String:[stdOutData bytes]]; //My Hello World 

Per esempio queste cose in C# possono essere facilmente fatto con NamedPipeClientStream, NamedPipeServerStream classi in cui le pipe sono registrate dalla stringa id.

Come raggiungerlo in Objective-C?

+0

La tua domanda su due thread all'interno dello stesso processo o su processi separati che comunicano tramite una pipe? –

+0

Circa due thread che comunicano tramite una pipe – Andrew

+0

In che modo è possibile ottenere processi separati che comunicano tramite una pipe? – vadivelu

risposta

3

Se ho compreso correttamente la tua domanda, puoi semplicemente creare un NSPipe e usare un'estremità per la lettura e un'estremità per la scrittura. Esempio:

// Thread function is called with reading end as argument: 
- (void) threadFunc:(NSFileHandle *)reader 
{ 
    NSData *data = [reader availableData]; 
    NSString *message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@", message); 
} 

- (void) test 
{ 
    // Create pipe: 
    NSPipe *pipe = [[NSPipe alloc] init]; 
    NSFileHandle *reader = [pipe fileHandleForReading]; 
    NSFileHandle *writer = [pipe fileHandleForWriting]; 

    // Create and start thread: 
    NSThread *myThread = [[NSThread alloc] initWithTarget:self 
               selector:@selector(threadFunc:) 
                object:reader]; 
    [myThread start]; 

    // Write to the writing end of pipe: 
    NSString * message = @"Hello World"; 
    [writer writeData:[message dataUsingEncoding:NSUTF8StringEncoding]]; 

    // This is just for this test program, to avoid that the program exits 
    // before the other thread has finished. 
    [NSThread sleepForTimeInterval:2.0]; 
} 
+0

grazie! Funziona benissimo – Andrew

+0

@Andrew: siete i benvenuti, sono contento che sia stato d'aiuto. –

+1

ok. Non ho capito bene. Come funziona questo per consentire a due app di comunicare tra loro. E dove la pipa imposta una sorta di identificatore da condividere tra le app? Inoltre, quante app potrebbero utilizzare un set di pipe? –