2009-08-30 123 views
2

其他人在10.6中看过或听说过NSTask有任何问题吗?OS X 10.6中的NSTask问题Snow Leopard

此代码昨天工作得很好,今天是行不通的。

NSTask *task = [converter task]; 
[task waitUntilExit]; 
NSLog(@"Task did complete"); 

任务做什么它应该做的(我检查了输出和它的罚款),但该程序将在waitUntilExit方法无限期地等待。我有几个使用类似代码的单元测试,他们都已经通过了,但是截至昨天,他们不再工作。

+0

如果用一个简单的脚本替换一个退出0,会发生什么?你现在用的那个? – 2009-10-12 02:56:49

+0

我看到类似的问题,上面的代码有时会立即完成,有时需要几秒或更长时间才能完成。真奇怪! – Locksleyu 2016-01-22 15:10:55

回答

0

检查ps,top或Activity Monitor。确保你的程序退出。

+0

它显示在活动监视器中并正常退出。它正在转换的文件被转换并且不被破坏。看起来任务正在完成,但不知何故通知任何人它已完成。 – kubi 2009-08-31 02:44:08

1

(1)您是否以任何方式处理任务的输出?如果是这样,如果你不读&一路处理数据,输出的缓冲可能会阻塞。

(2)你的任务是否等待EOL标准输入终止前?如果是这样,你会想要抓住标准输入并明确关闭它。

正如彼得说,检查PS,看看你的任务仍在运行。如果是这样,请使用sample对其进行抽样以确定它要做什么。

1

可能 - 我注意到我的一些代码在10.6上出现问题,听起来像您的问题。

我需要得到一些网络信息(主要是关于BGP和AS的东西)在一个完全异步的方式。对我来说,理想的解决方案是将特殊的DNS TXT记录请求发送到可公开访问的DNS服务器,但Cocoa/Core Foundation不提供用于执行这些奇怪球DNS请求的API。另一种方法是使用shell% whois -h IP 'SPECIAL REQUEST'并解析输出中的相关信息。这是我可以在几个小时内启动并运行的事情,稍后再回来并投入实际解决方案。非常黑客,但速度比1)找到一个合适的异步DNS库和2)加快API速度并可能为它编写一个封装。

所以,我创建了一个类,它分出后台线程,然后NSTask启动whois请求。后台线程位于NSRunLoop循环中以处理结果,但会检查每秒的1/10,以查看NSTask是否因某种原因而死亡,或者是否等[NSThread isCanceled]等。它还会注册NSApplicationWillTerminateNotification通知以便它可以执行如果应用程序正在退出,则进行适当的清理。

嗯,10.6 ......我再也不干“快速”。在10.5上,一切都是光滑的,应用程序立即退出,至少在感知上退出。在10.6以下,退出导致应用程序“挂起”。调试表明,一切都被挂起,试图清理挥之不去的whois NSTask s。由于我没有获得这种方式的信息对于应用程序功能至关重要(这是额外的,很高兴知道各种信息),所以我只是对其进行了处理并停止尝试将信息作为停止解决方案。

的快速传递在调试问题表明,主要的应用程序被阻塞在试图获取实例NSLock。有趣的是,如果我把它放在一边,应用程序最终会正常退出 - 从10-20秒到分钟的任何地方.. 10.5和10.6之间的某些变化导致代码包含在[NSLock lock] ... [NSLock unlock]块中“需要很长时间” 。我还没有找到发生的地方,虽然(尚未优先)....但其中一件事是终止背景NSTask,如果它仍然在运行,并“等待它完成”,然后它可以安全地摆脱像它的NSPipe这样的东西。

DUP:这可能是一个愚蠢的答案......我的第一个似乎已经消失在任何一方?

+0

听起来很像我的问题。我没有碰到NSLock,新的程序完全通过NSTask来控制,所以我的问题在那里。吮吸你没有(但)有一个解决方案,但我会保持你更新,如果我想出任何东西。 – kubi 2009-08-31 02:47:02

2

您需要添加下面的魔线:

[task setStandardInput:[NSPipe pipe]]; 
0

不知道有没有什么帮助,但你可以尝试做等待一个单独的线程:

[NSThread detachNewThreadSelector: @selector(foo) toTarget: self withObject: task]; 

... 

- (void) foo: (NSTask *) task { 
    [task launch]; 
    [task waitUntilExit]; 
    ... 

我有一个问题,即当任务完成时,我没有得到NSNotification,并且这固定了它。显然,在10.6下的NSTask实现中有一些错误...

相关问题