代码改变世界

多线程退出优化

2013-06-15 02:11  鉴于  阅读(431)  评论(0编辑  收藏  举报

监控客户端支持同时播放最大8路视频,每个设备有个CCamera类对其进行抽象,CCamera中有工作线程进行视频收发和任务异步执行操作。如果需要退出应用程序时,首先需要对各个CCamera对象依次进行如下操作:
永久激活CloseEvent,不在接受新得任务请求。
停止接受视频数据,断开和设备的网络连接
清除队列中的帧数据
清除未完成的任务

最初设计是串行执行的,如果同时播放8路视频,需要依次对Camera进行如下操作。退出应用程序时耗时较长,容易出问题。
参考eMule删除任务的通知方式,将在CCamera对象销毁之前先调用一次NotifyClose(),在该函数中激活CloseEvent。工程线程一直在使用WaitForMultiObjects等待CloseEvent、TaskEvent等。如果CloseEvent被触发,工作线程将调用函数去执行”断开和设备的视频连接”、”清除队列中的帧数据”、”清除未完成的任务”等操作。

这样再释放所有CCamera之前,先依次调用一遍NotifyClose通知各个Camera进行关闭处理,具体关闭处理由各个工作线程完成。然后再依次释放CCamera。这样就将串行的操作改为并行执行,能极大的缩短应用程序退出所需要的时间。