繁体   English   中英

从NSTextField发送值到不断运行NSTask

[英]Send value from NSTextField to constantly running NSTask

有几个与NSTask相关的问题,但在翻阅之后我仍然不知道该怎么做。

我正在为Cocoa中的java服务器编写一个前端,由java -Xmx1024M -Xms1024M -jar server.jar nogui (我在我当前的代码中省略了nogui arg,以免用不必要的孤儿填满我的计算机服务器的实例)。

我当前的代码正确运行.jar文件; 现在我需要一种方法来捕获(和解析)输出并将输入发送到进程。

server = [[NSTask alloc] init];
pipe = [NSPipe pipe];
NSArray *args = [NSArray arrayWithObjects:@"-Xms1024M",
                    @"-Xmx1024M",
                    @"-jar",
                    @"server.jar",
                    nil];

[server setLaunchPath:@"/usr/bin/java"];
[server setCurrentDirectoryPath:@"MyApp.app/Contents/Resources/"];
[server setArguments:args];
[server setStandardOutput:pipe];
[server setStandardInput:pipe];
[server launch];

我已经阅读了NSPipeNSTask以及所有内容,但我似乎无法回答我的问题:

  • 实时,解析(RegEx?)输出到NSTextViewNSTableView
  • NSTextField输入

编辑: 或者我应该使用launchd 我该怎么办?

您需要创建两个管道:一个用于任务的标准输入,另一个用于任务的标准输出。 你正在做什么现在将任务的输出连接到它自己的输入。

像这样的东西:

@interface ServerController : NSObject
@property (strong) NSFileHandle *standardInput;
@property (strong) NSFileHandle *standardOutput;
@end

@implementation ServerController

...

- (void)launchServer {
    NSPipe *standardInputPipe = [NSPipe pipe];
    self.standardInput = standardInputPipe.fileHandleForWriting;
    NSPipe *standardOutputPipe = [NSPipe pipe];
    self.standardOutput = standardOutputPipe.fileHandleForReading;
    ...
    server.standardInput = standardInputPipe;
    server.standardOutput = standardOutputPipe;
    [server launch];
}

...

现在,您可以通过将writeData:消息发送到ServerController实例的standardInput属性来写入服务器。 为了从服务器读取,你要为使用readInBackgroundAndNotifyreadabilityHandlerstandardOutput财产。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM