runningApplications返回已终止的进程?

时间:2015-02-23 13:48:10

标签: objective-c cocoa

我已经实现了一个必须等​​待特定进程完成的类(使用NSWorkspace openFile:withApplication启动)。

我尝试了[[NSWorkspace sharedWorkspace] runningApplications],它确实返回了一系列正在运行的进程。但它仍然包含我想监视的进程,即使此进程不再运行(它从活动监视器中消失,并且没有显示在top命令中)。

有没有人知道如何正确监控进程?检查terminated属性或processIdentifier属性不起作用(terminated仍为NOprocessIdentifier包含有效的查找进程ID。< / p>

1 个答案:

答案 0 :(得分:2)

只有在允许运行主循环时才会更新

-runningApplications。如果您正在轮询或以其他方式保持主运行循环忙,那么它将永远不会更新。

来自NSWorkspace

  

与NSRunningApplication类的属性类似,此属性仅在主运行循环以共同模式运行时才会更改。而不是轮询,使用键值观察来通知此数组属性的更改。

     

从任何应用程序的线程调用此方法是安全的。该方法以原子方式返回其值。

     

使用键值观察可以观察到此方法返回的值。

我可能只是获取NSRunningApplication本身,而KVO会观察其terminated属性。只要确保允许主运行循环继续运行。

如果你有一个GUI应用程序,这是正常的事态;从你的方法返回。如果这是一个命令行应用,那么根据我使用NSWorkspace的经验,最好的解决方案是将[NSApp run]放入main(),以便像GUI应用一样启动它。这通常意味着创建一个app delegate并将大部分代码放在那里,而不是main()。如果您通常退出计划,只需致电[NSApp terminate:nil]

当然,你也可以亲自用runMode:beforeDate:运行主要的runloop。 (我记得虽然使用NSApplication对我来说效果更好。但是我不记得为什么。可能是听通知。所以也许手动运行循环很好。)< / p>