NSTask выполняется только один раз - PullRequest
3 голосов
/ 17 мая 2010

У меня проблемы с выполнением разных 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]
}

Проблема в том, что исполняется только первый. Вторые даже не вызывают событие «щелчка» (через target-action). Я думаю, что это может быть причиной запускаPath, который я пытаюсь использовать, потому что простой /bin/ls работает нормально. Та же команда в терминале имеет 0 возвращаемое значение (т.е. все в порядке). Любые гиды или ошибки очень ценятся.

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Я не могу понять почему ... но прочитал из многочисленных мест , что NSTask может быть запущен ТОЛЬКО один раз ....

Используя NSTask, ваша программа может запускать другую программу в качестве подпроцесса и контролировать ее выполнение. NSTask создает отдельный исполняемый объект; в отличие от NSThread, он не разделяет пространство памяти с родительским процессом. По умолчанию задача наследует несколько характеристик среды своего родителя: текущий каталог, стандартный ввод, стандартный вывод, стандартная ошибка и значения любых переменных среды. Если вы хотите изменить любой из них, например, текущий каталог, вы должны установить новое значение перед запуском задачи. Среда задачи устанавливается после ее запуска.

NSTask может быть запущен только один раз. Последующие попытки запустить NSTask приводят к ошибке.

Если вы запускаете задачу из документа в приложении, основанном на документе, вам следует (как минимум) отправить сообщение о завершении в экземпляр задачи в коде очистки документа. См. Также NSTaskTermination для дальнейшего обсуждения.

Это кажется нелепым ... Я буду исследовать и отправлять сообщения, если найду какую-либо информацию, которая противоречит этому источнику (хотя обычно она достоверна).

0 голосов
/ 15 сентября 2011

Если вам захочется пройтись по темным водам, которые окружают PyObjC, вы можете легко использовать механизм Python subprocess снова и снова, снова и снова. Ах да.

...