3

我在执行不同的 NSTask 时遇到问题。相同launchPath,不同arguments。我有一个类,其实例管理自己的NSTask对象,并根据参数初始化这些实例 -NSTask正在创建依赖对象。我有两个初始化程序:

// Method for finished task
- (void)taskFinished:(NSNotification *)aNotification {
  [myTask release];
  myTask = nil;

  [self createTask];
}

// Designated initializer
- (id) init {
  self = [super init];
  if (self != nil) {
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(taskFinished:)
                                                 name:NSTaskDidTerminateNotification 
                                               object:nil];
    [self createTask];
  }
  return self;
}

// Convenience initializer
- (id)initWithCommand:(NSString *)subCommand {
  self = [self init];
  if (self)
  {
    [self setCommand:subCommand];
  }
  return self;
}

这是createTask方法:

- (void)createTask {
  // myTask is a property defined as NSTask*
  myTask = [[NSTask alloc] init];
  [myTask setLaunchPath:@"/usr/bin/executable"];
}

通过在 NSOutlineView 中选择不同的行来执行这些操作(使用 PXSourceList 作为包装器):

- (void)sourceListSelectionDidChange:(NSNotification *)notification {
  id sourceList = [notification object];
  NSIndexSet *selection = [sourceList selectedRowIndexes];
  NSString *identifier = [[sourceList itemAtRow:[selection firstIndex]] identifier];

  // this way `/usr/bin/executable ${identifier}` is being created
  MyCommand *command = [[MyCommand alloc] initWithSubcommand:identifier];

  // this method executes [myTask launch];
  [command execute]
}

问题是只有第一个被执行。第二个甚至不会触发“点击”事件(通过目标操作)。我认为这可能是我尝试使用的 launchPath 的原因,因为简单的/bin/ls工作正常。终端中的相同命令具有 0 返回值(即一切都很好)。非常感谢任何指南或陷阱。

4

2 回答 2

1

我不明白为什么......但是从许多地方读到 NSTask 只能运行一次......

使用 NSTask,您的程序可以将另一个程序作为子进程运行,并可以监视该程序的执行。NSTask 创建一个单独的可执行实体;与 NSThread 不同的是,它不与父进程共享内存空间。默认情况下,任务继承其父环境的几个特征:当前目录、标准输入、标准输出、标准错误以及任何环境变量的值。如果您想更改其中任何一个,例如当前目录,您必须在启动任务之前设置一个新值。任务的环境一旦启动就建立起来。

一个 NSTask 只能运行一次。随后尝试运行 NSTask 会引发错误。

如果您从基于文档的应用程序中的文档运行任务,您应该(至少)在文档的清理代码中将终止消息发送到任务实例。另请参阅 NSTaskTermination 以获得更多讨论。

这看起来很荒谬......如果我发现任何与此来源相矛盾的信息,我会进行研究并回帖,(尽管它通常是可靠的。)

于 2011-08-16T22:56:41.613 回答
0

如果您愿意涉水 PyObjC 周围的浑水,您可以轻松地使用subprocessPython 的机制.. 一遍又一遍,一遍又一遍。哦耶。

于 2011-09-14T23:00:20.187 回答