我正在写一个EXE COM服务器,公开一个locking系统资源的类。 在正常的执行过程中,客户端释放资源(COM可执行文件在几秒钟后closures,如果执行exception,客户端应用程序崩溃,COM服务器的实例引用计数为正,COM运行约12分钟,直到终止,这意味着系统资源在此期间被locking。
有没有一种方法来检测客户端瞬间终止,如套接字IPC或驱动程序协议? 如果不是这样,COM似乎不如其他IPC机制。
Windows上的Python 3.4中的Tkinter不会将内部剪贴板数据发布到退出时的Windows剪贴板上
从MS Windows任务栏隐藏窗口
python ctype初始化一个结构
在Linux和Windows上使用C或C ++parsingXML的常见分母XML库是什么?
几年前我也有同样的问题。 我在这里找到答案: 如何关闭COM垃圾收集机制 。 总之:不,无法立即检测到客户端的终止。 摘录:
当COM客户端正常终止时,它释放对其服务器对象的所有引用。 但是,当客户端异常终止时,可能会有未完成的对服务器对象的引用。 没有垃圾收集机制,服务器代码无法知道何时回收为COM对象分配的资源,这会导致资源泄漏。 为了解决这个问题,COM实现了一个自动的垃圾收集机制,客户机上的COM解析器进程(RPCSS)代表客户机进程对服务器机器进行ping操作。
使用COM的GC协议的替代方法(例如,使用周期性的应用程序级别的“ping” – 通知对象客户端仍然活着的方法调用,或者使用诸如TCP keepalive之类的基础传输机制)显然效率低得多。 因此,DCOM的默认GC机制应该用于当客户端消失时必须关闭的任何对象,或者如果这些对象在服务器上实际上成为内存泄漏,则应该使用DC机制。
服务器机器上的解析器会跟踪每个服务器对象的ping。 ping时间是2分钟,目前是不可配置的。 当服务器机器上的解析器检测到对象未被ping通6分钟时,它假定该对象的所有客户端已经终止或以其他方式不再使用该对象。 解析器将释放对象的所有外部引用。 它通过简单地在对象的IUnkNown接口上具有对象的存根管理器(COM运行时代码,用于传递每个对象的调用)调用:: Release()。 此时,就COM运行时而言,对象的引用计数将为零。 (可能仍然有本地(同一公寓)客户持有的引用,因此此时对象的内部引用计数可能不一定为零)。然后,对象可能会自行关闭。
注:垃圾收集适用于所有服务器,无论其客户端是本地还是远程,还是本地和远程的组合。 在本地情况下,基础的ping机制是不同的,因为没有生成网络分组,但是对于所有实际的目的,行为是相同的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。