2015-02-23 83 views
0

我已經實現了一個必須等​​待特定過程完成的類(使用NSWorkspace openFile:withApplication開始)。runningApplications返回終止的進程?

我試過[[NSWorkspace sharedWorkspace] runningApplications],並不會返回正在運行的進程的數組。但它仍然包含我要監視的進程,即使此進程不再運行(它從活動監視器中消失,並且不會顯示在top命令中)。

有沒有人有線索如何正確監視進程?檢查terminated屬性或processIdentifier屬性並不能解決問題(terminated仍然爲NO,並且processIdentifier包含有效的查找過程ID)。

+0

'[[ [NSWorkspace sharedWorkspace] runningApplications]在您調用它時返回正在運行的應用程序。我以這種方式測試它:1.我啓動了計算器應用程序。 2.調用'[[NSWorkspace sharedWorkspace] runningApplications]'3.退出計算器應用程序4.調用runningApplications。 它工作完美:計算器應用程序出現在第2步,但不是在第4步。我不知道你是如何使用它。 – Sudo 2015-02-23 15:10:19

+0

我用一個do-while循環嘗試了它,它只包含一個'[NSThread sleepForTimeInterval:2]'和while語句中正在運行的進程的檢查。 – Alex 2015-02-24 06:32:06

+1

似乎正是這種睡眠引起的問題。 – Alex 2015-02-24 08:39:32

回答

2

-runningApplications只在主運行循環被允許運行時更新。如果您正在輪詢或以其他方式保持主運行循環忙碌,則永遠不會更新。

NSWorkspace

到NSRunningApplication類的性質類似,當主運行的循環是在普通模式下運行,此屬性將只更改。不要使用輪詢,而是使用鍵值觀察來通知對此數組屬性的更改。

從任何應用程序的線程調用此方法是安全的。該方法以原子方式返回其值。

該方法返回的值可以使用鍵值觀察來觀察。

我可能只是抓取NSRunningApplication本身,KVO觀察它的terminated屬性。只要確保主運行循環可以繼續。

如果你有一個GUI應用程序,這是正常的事態;只是從你的方法返回。如果這是一個命令行應用程序,那麼根據我的經驗與NSWorkspace合作的最佳解決方案是將[NSApp run]放入main()以像GUI應用程序一樣啓動它。這通常意味着創建應用程序委託並將大部分代碼放在那裏,而不是在main()中。當您通常退出程序時,請致電[NSApp terminate:nil]

當然,你也可以僅僅通過手runMode:beforeDate:自己運行的主要runloop。 (我記得對我來說使用NSApplication效果更好,但是我不記得原因,可能是聽通知,所以也許手動運行循環就沒問題了。)

+0

看起來像'NSRunningApplication'對象不能被觀察到。所附的觀察員從未被觸發(我不知道爲什麼)。 – Alex 2015-02-24 08:30:41

+0

但是''runMode:beforeDate:'你的提示完成了。非常感謝! – Alex 2015-02-24 08:38:48