集合对象同步和访问控制问题 求助
本人最近在做一个用图形化界面监控网络设备实时状态的小程序,遇到了很多问题,特请高手指点。
我现在的设计:基本采用类似简单的MVC的方式,UI层显示设备,Data层维护所有设备的状态(包括定时的发送SNMP进行查询等),并且当设备状态变化时(比如断线了),就要通知UI层进行刷新界面或者联动报警。
UI层我维护了一个设备集合,这个集合是一个CUiDevice的指针,这个类是UI设备层的设备共有基类,主要有一些UI层面的属性(比如设备位置、图标颜色这些)。
Data层有两个集合,一个和UI层集合对应,当UI层调用注册观察者时将一个CUiDevice指针写入到这个集合,取消监控时删除。 另外一个集合是设备详细信息集合,根据UI层注册的设备建立一个设备详细信息来存储设备的状态信息。
程序运行时,UI层先把设备部署到界面上(同时向Data注册),Data层的查询线程不断轮询注册的那个集合,取出设备ID,然偶去查设备信息,并更新详细信息集合。然后判断是不是有需要更新UI的信息,如果有则调用CUiDevice::Updata(DWORD)接口传入一个更新掩码。 这样UI层就知道具体需要更新哪些内容。
UI层要要实现通过设备图标闪烁来报警,所以我给CUiDevice添加了一个属性(isAlarm),用一个线程来轮询UI层的集合,然后每次改变设备图标,并刷新界面,每半秒一次,以此达到闪烁的效果。
UI层和Data层的集合对象都有同步控制。
现在的问题是:
1.设备很多的情况下Data层更新设备信息很慢,一个线程轮询所以很慢。
2.UI层报警多了之后,图标闪烁不对,而且经常界面卡死,应该是死锁了。
3.当UI删除一个设备图标是,要调用Data层的取消注册,然后删除集合中的对应元素并释放其指向的空间。但程序时不时的就崩溃了。
4.而且CUiDevice::Updata(DWORD)不是异步调用,让我感觉UI和Data没有分开,更导致Data层自动更新缓慢。
我用的一些解决办法:
1.对第一个问题暂时没有处理
2.第二个,我开始改成了读写锁来同步集合对象(就是共享读独占写),但是一旦执行删除或者添加时还是不理想。后来我就掉了同步锁。这样速度快起来了,但是第三个问题就来了,一删除设备基本就挂了。
3.我还采用过遍历前先拷贝一个集合副本,但是由于集合存储的本身是对象指针,副本作用不大,一用指针访问时就容易挂,因为设备都删除了。
在网上看了很多同步集合对象的,基本都是说需要同步,但是没有看到如何高效同步的,尤其是我的集合对象需要轮询遍历,并且每个遍历的动作花费的时间很长,如果一直锁住集合,界面肯定锁死了。
大家帮帮忙,看看有啥好办法,不甚感谢。
哪位如果有类似的示例代码可以发到我邮箱,感谢了。2109754@163.com,或者QQ交流:59387202
由于本人基本上很晚才下班(万恶的加班),白天不能来看,希望明天晚上能够看到解决办法,谢谢了!
助人为乐!实在没有分给了。。。