今天记一下工作经验吧。
在很多软件中,都会有进度条,进度条显示了另外一个线程的工作进度。
我们的项目也有这样的一个进度条,测试同学那边发现,在他的测试环境,必现一个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)!
所以, 只靠黑盒测试去保证多线程程序的质量,是多么不靠谱!