我已经实现了一个必须等待特定进程完成的类(使用NSWorkspace openFile:withApplication
启动)。
我尝试了[[NSWorkspace sharedWorkspace] runningApplications]
,它确实返回了一系列正在运行的进程。但它仍然包含我想监视的进程,即使此进程不再运行(它从活动监视器中消失,并且没有显示在top
命令中)。
有没有人知道如何正确监控进程?检查terminated
属性或processIdentifier
属性不起作用(terminated
仍为NO
且processIdentifier
包含有效的查找进程ID。< / p>
答案 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>