今天记一下工做经验吧。
在不少软件中,都会有进度条,进度条显示了另一个线程的工做进度。
咱们的项目也有这样的一个进度条,测试同窗那边发现,在他的测试环境,必现一个bug:主界面的进度条进度一直为0。
很郁闷的是,我用本身的电脑,不管是win7和win8,都不能重现这个bug......
难道是UI绘制的问题?不,感受不像,接着,我把子线程向UI上报的进度逐一打印出来:
10 20 30100 0
很明显,子线程的工做已经作完了,但是最后上报了进度0!
并且,子线程的工做时间极短,因此用户也察觉不到是进度条到了100再变回0的!
出问题的伪代码以下:
void func()
{
beginCopy(); // 该函数建立一个线程copy,而后根据进度调用updateProgress更新UI
updateProgress(0); // 初始化进度条
}
将
updateProgress移到beginCopy以前便可解决该bug。
咱们的软件发布了这么久,也通过了不少测试,为何一直没发现这个bug呢?
能够想到,上报的进度0,只要不是在beginCopy线程彻底退出后执行,用户是不会有感知的,而刚好在某个测试环境下,beginCopy线程是彻底退出后才会执行updateProgress(0)!
因此,
只靠黑盒测试去保证多线程程序的质量,是多么不靠谱!