2012-12-19 15 views
6

Potrzebuję zrealizować komunikację między dwoma wątkami za pomocą kanałów NSPipe, problemem jest to, że nie muszę wywoływać polecenia terminala, określając te metody.Komunikacja między procesami za pomocą NSPipe, NSTask

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

po prostu trzeba napisać niektóre dane

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

a na drugim wątku, aby otrzymać tę wiadomość

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

Na przykład takie rzeczy w C# można łatwo zrobić z NamedPipeClientStream, NamedPipeServerStream klasy, w których rury są rejestrowane przez ciąg id.

Jak to osiągnąć w Objective-C?

+0

Czy Twoje pytanie dotyczy dwóch wątków w ramach tego samego procesu lub oddzielnych procesów, które komunikują się przez potok? –

+0

Jest to około dwóch wątków, które komunikują się za pośrednictwem rury. – Andrew

+0

W jaki sposób można uzyskać oddzielne procesy, które komunikują się za pośrednictwem potoku? – vadivelu

Odpowiedz

3

Jeśli dobrze rozumiem twoje pytanie, możesz po prostu utworzyć NSPipe i użyć jednego końca do czytania i jednego końca do pisania. Przykład:

// 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

dziękuję! Działa świetnie – Andrew

+0

@Andrew: nie ma za co, cieszę się, że to pomogło. –

+1

ok. Jestem zmieszany. Jak to działa, aby umożliwić dwóm aplikacjom komunikowanie się ze sobą. I gdzie rury ustawiają jakiś identyfikator do współdzielenia między aplikacjami? Ile aplikacji może korzystać z jednego zestawu rur? –