2010-05-17 142 views
3

我在执行不同的NSTask时遇到问题。相同launchPath,不同arguments。我有一个类的实例管理自己的NSTask对象,并取决于这些实例初始化与 - 依赖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"]; 
} 

的行动通过(使用PXSourceList作为包装器)中NSOutlineView选择不同行执行:

- (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的返回值(即一切正常)。任何指南或陷阱都非常感谢。

+0

我认为我们需要看到操作方法。你在启动任务时是否禁用了按钮?这似乎是必要的,因为你只有一个'myTask'实例变量。 – 2010-05-17 06:42:12

+0

我更新了请求的细节代码。 – Eimantas 2010-05-17 13:22:04

回答

1

我无法理解为什么...但是从NSTask只能运行一次numerous places已经阅读....

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

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

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

这似乎是荒谬的......如果你愿意来趟的浑水我将研究和后回来,如果我发现任何信息的相矛盾这一来源,(尽管它通常是可靠的。)

+0

我明白,但看到我的第一个代码示例。在'-taskFinished'方法中,我释放'NSTask'对象并将该指针分配给nil。因此它应该作为一个新的对象重新运行。 – Eimantas 2011-08-17 03:23:09

0

那围绕着PyObjC,你可以很容易地使用Python的机制subprocess ..结束了,结束了,结束了。哦耶。