VB进度条实现
通常对一个长时间执行的任务,如果不给以用户友好提示,会造成用户误解以为是程序出问题。对这样的情况一般是做进度条或者一个动态加载的图片实现用户友好性。这两种方式在JAVA里面很好实现,小菜一碟,但VB实现起来就麻烦点,可能本人对VB了解得还不够多,近期在弄这个VB客户端用户提示的,抽空写篇心得,方便自己以后查阅。
?
VB用户友好提示有几种方法:
1、进度条(使用VB自带进度条控件)
2、使用动态图片
?
对于VB自带进度条控件,他的实现方式是我们长时间执行的任务在一个for循环里面,因VB是以单线程模式运行,程序只有等待循环运行结束后才执行别的程序代码,这样机器一直处于循环之中,而不能响应别的事情,对CPU资源来说是一种浪费,那么可不可以既让循环执行,又可以执行程序另外的一部分代码呢?答案是可以的,用多线程(VB多线程可以用API函数实现和创建activex_exe实现)或者DoEvents。这里实现方式是DoEvents。通过在循环里面调用DoEvents释放CPU让Timer执行进度条任务。
?
Form1.frm(4个控件:ProgressBar1、Text1、Timer2、Command1)
Option Explicit Private Sub Command1_Click() Dim a As Integer Form1.Enabled = False Timer2.Enabled = True For a = 0 To 2000 Text1.Text = a Sleep 1 DoEvents Next ProgressBar1.Value = 100 Timer2.Enabled = False Form1.Enabled = True MsgBox "Download Finish" End Sub Private Sub Form_Load() Timer2.Enabled = False End Sub Private Sub Timer2_Timer() Do If ProgressBar1.Value = 100 Then ProgressBar1.Value = 0 ProgressBar1.Value = ProgressBar1.Value + 10 Exit Do Loop End Sub
?
效果:
?
?
?
对于使用动态图片实现用户友好提示的,VB不支持动态图片格式GIF,需要分解GIF图片为多个切片图片,然后用timer一帧一帧的实现。
?
?
上面两种方式单个单个的运行都还可以,但是当我们执行一个长时间运行的任务时调用它们,在IDE中调试是可以实现,但是打包安装之后运行就不行,非得我们的大任务执行完之后才会调用,或者调用完进度条之后才调用大任务的。在VB中总是这种单任务运行方式。
?
其实上面的两种方法,第一种只在长时间执行的循环里面有效果,如果长时间执行的不是一个循环而是其他的操作,还是得多线程方式实现。第二种也不稳定,打包,安装之后运行我们的程序还是有个先后调用问题,根本不是异步方式,又还是得多线程,NND胸。
?
上面的两种方法遇到不是一般的需求,只能用多线程实现了。
见:http://yaojialing.iteye.com/blog/1107370