2009-08-30 147 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實現中有一些錯誤...

相關問題