设想情况:
我在mac应用程序和launchd守护进程(用基金会类编写)之间有一个基于分布式对象的IPC。因为我以前在异步消息传递方面有问题(例如,我有一个registerClient:服务器的根对象上有一个事件,并且每当服务器的根对象通知/调用客户机的代理对象中的一个方法),所以我做了长轮询,这意味着客户机从守护进程中“获取”事件/通知的列表。这个“收获”是通过服务器对象方法调用完成的,然后服务器对象方法调用返回一个NSArray实例。
它运行得很好,直到有几秒钟,服务器对象的进程(通过启动的通道启动)开始被标记为红色,旁边有“(未响应)”标记()。就像我说的,在功能上,它工作得很好,但是我们只是想去掉这个“没有响应”的标签。
如何防止这个“未响应”标记?
FYI,我之前已经做过基于启动的进程,这是我第一次做长时间轮询。此外,我尝试了基于NSSocketPortNameServer的连接和基于NSSocketPort的连接。他们没有这个问题。锁定也不是一个问题,因为所使用的锁只是NSCondition的锁,我们登录并调试了程序,似乎唯一的锁定“问题”是在收获部分,实际上,这在功能上是有效的。同时,客户端进程是用PyObjC编写的,而服务器进程是用ObjC编写的。
提前谢谢。
发布于 2009-08-25 23:45:07
我的问题实际上是调用使用签名FNDR获取进程的PID .该部分导致了“未响应”错误,并且它从来不是锁或长轮询部分。对这家伙很抱歉。但谢天谢地我已经找到答案了。
发布于 2009-06-25 21:33:30
示例这个过程来找出它在做什么或等待什么。
发布于 2009-06-26 14:30:11
彼得在方法上是正确的,尽管你也许可以通过简单的检查来找出它。“不响应”意味着您至少在5秒内不处理事件队列中的事件(以前是2秒,但它们在10.4中增加了)。对于UI进程,这将创建一个旋转等待游标,但对于非UI进程,您并不能很容易地看到效果。
如果这是一个基于runloop的程序,这意味着您可能正在使用一个应该使用run循环和回调(异步)完成的阻塞(同步)操作来执行一些操作。或者,您需要第二个线程来处理阻塞操作,这样您的主线程就可以继续响应事件。
https://stackoverflow.com/questions/1044039
复制相似问题