这几天公司相关的设备软件要做新版本release的最后检测工作,大问题没有,但是出现了两个细节的问题:一个是在等待元件进入设备的时候整个屏幕呈现出了明显的低频闪动,另外一个问题是在元件检测的工程中屏幕内的某个区域出现了高频的快速刷新,重绘的循环过程,从而导致了高频闪动。这两个问题其实并不算逻辑性的bug,只是会造成一些视觉上的不适(设备是自动化检测设备,其实也不需要操作员实时的在产线上)。但是这恰恰戳中了我刨根问底的那股劲儿,我决定对代码做一次review,找到问题的根源。
认真分析了代码,我发现了同事在合并一些新功能代码的时候,忽略了一些细节:
首先是在设备waiting的阶段,为了更新一些实时的数据,同事在某个循环中加入了如下的语句
InvalidateRect(hWnd,NULL,FALSE);
UpdateWindow(hWnd);
这是两行代码适用于刷新指定区域的窗口。InvalidateRect用于使指定句柄区域失效,之后才能通过updatewindow重新绘制指定的句柄的区域。两者必须配合使用才能实现页面的刷新。用法是没有问题的,但是在循环中使用的时候要注意,如果要做更新的内容较多(例如整个屏幕,而且信息较多)的话,加之更新的较为频繁,很容易会出现明显的本文所提到的第一个问题,即出现屏幕低频的闪动。
解决思路:(1)当然就是去除冗余的uptdatewindow的代码(2)不得不在循环中使用updatewindow的时候,注意添加一些判定条件,当页面有更新信息的时候再进行update。我采用了后者,哈哈,解决了一个问题。<