Cocoa分布式对象,长轮询,启动和活动监视器中的“无响应”

时间:2009-06-25 13:47:10

标签: objective-c cocoa pyobjc launchd distributed-objects

情景:

我在mac应用程序和launchd守护程序(用Foundation类编写)之间有一个基于分布式对象的IPC。由于我之前遇到过有关异步消息传递的问题(例如,我有一个registerClient:在服务器的根对象上,每当有事件时服务器的根对象通知/调用客户端代理对象中的方法),我做了长轮询,这意味着客户端“收集”来自守护程序的事件/通知列表。这个“收获”是通过服务器对象方法调用完成的,然后返回一个NSArray实例。

它运行良好,直到几秒钟,服务器对象的进程(通过launchd启动)开始被标记为红色,旁边有“(无响应)”标记(在Activity Monitor内)。就像我说的那样,功能上,它运作良好,但我们只是想摆脱这个“没有响应”的标签。

如何阻止此“无响应”标记?

仅供参考,我之前已经开始使用基于启动的流程,这是我第一次进行长轮询。此外,我尝试了基于NSSocketPortNameServer的连接以及基于NSSocketPort的连接。他们没有这个问题。锁定也不是一个问题'因为使用的锁只是NSCondition的,我们记录并调试了程序,它似乎唯一锁定“问题”在收获部分,实际上,功能上有效。此外,客户端进程是用PyObjC编写的,而服务器进程是使用ObjC编写的。

提前致谢。

3 个答案:

答案 0 :(得分:2)

Sample了解它正在做什么或等待的过程。

答案 1 :(得分:2)

彼得在方法上是正确的,尽管你可以通过简单的检查来弄明白。 “没有响应”意味着您不会在事件队列中处理事件至少5秒(过去是2秒,但是它们在10.4中加倍)。对于UI过程,这将创建旋转等待光标,但对于非UI过程,您不会轻易看到效果。

如果这是一个基于runloop的程序,这意味着你可能正在做一些阻塞(同步)操作,应该用run loop和callback(async)完成。或者,您需要第二个线程来处理阻塞操作,以便您的mainthread可以继续响应事件。

答案 2 :(得分:2)

我的问题实际上是使用签名FNDR获取进程的PID的调用...该部分导致“无响应”错误,它从来不是锁或长轮询部分。抱歉这个家伙。但感谢上帝,我已经找到了答案。