关于用多线程显示进度条的有关问题
关于用多线程显示进度条的问题
我想通过程序进行数据库备份,同时开启一个线程用来显示进度条,代码如下。但是当点击按钮进行数据库备份的时候,进度条无法正常显示进度,当数据库备份结束后才显示进度条的进度,清高人指点。
'点击备份按钮事件
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Control.CheckForIllegalCrossThreadCalls = False
th = New Threading.Thread(New Threading.ThreadStart(AddressOf Me.progress))
Dim num As Long = 0
Me.Enabled = False
Me.ProgressBar1.Maximum = 100
Me.ProgressBar1.Minimum = 0
Me.ProgressBar1.Step = 10
Me.ProgressBar1.Value = 0
th.Start()
save()
bFinished = 1
End Sub
'显示进度条
Private Sub progress()
While Me.bFinished <> 1
If ProgressBar1.Value = 100 Then
Me.ProgressBar1.Value = 0
End If
ProgressBar1.Value += 10
Threading.Thread.Sleep(200)
Application.DoEvents()
End While
End Sub
'备份数据库
Private Sub save()
Dim datacomm As New DataComm
datacomm.data_connect()
Dim params() As SqlParameter = {New SqlParameter("@flag", SqlDbType.NVarChar), _
New SqlParameter("@backup_db_name", SqlDbType.NVarChar), _
New SqlParameter("@filename", SqlDbType.NVarChar)}
params(0).Value = "OK"
params(1).Value = "lh_pacs"
params(2).Value = "D:\data\lh_pacs" + CStr(Now.Date)
Directory.CreateDirectory("D:\data")
datacomm.data_executeSP("lh_backup_db", params)
'创建CIniAccess类的对象以书写配置文件和对字符串的加密
Dim oIni As New CIniAccess
'声明变量sPath记录配置文件的路径和文件名
Dim sPath As String = My.Application.Info.DirectoryPath + "\server1.ini"
'服务器IP
Dim server_ip As String = oIni.DecryptDes(oIni.INIRead(sPath, "单机版主机IP", "serverIP"), "12345678", "88888888")
'pacs的版本,如果isServer为“”或“true”,表示单机版;如果isServer为“false”,表示网络版;
Dim isServer As String = oIni.INIRead(sPath, "版本", "isServer")
If isServer = "false" Then '当前版本为网络版
MsgBox("您已经成功备份数据库至" + "\\" + server_ip + "\" + params(2).Value, , "提示!!")
ElseIf isServer = "" Or isServer = "true" Then '当前版本为单机版
MsgBox("您已经成功备份数据库至" + params(2).Value, , "提示!!")
End If
End Sub
------解决方案--------------------
帮你顶
------解决方案--------------------
While Me.bFinished <> 1
If ProgressBar1.Value = 100 Then
Me.ProgressBar1.Value = 0
End If
ProgressBar1.Value += 10
Threading.Thread.Sleep(200)
Application.DoEvents()
End While
如果bFinished不等于1,下面对进度条的操作都不会执行,所以出现“进度条无法正常显示进度,当数据库备份结束后才显示进度条的进度”
因为没有用过进度条,随意说说可以修改的方法。错了误怪:
去掉WHIle条件的判断,在设置了bFinished = 1的地方,停止th线程,设置进度条满格
------解决方案--------------------
严重关注中!
------解决方案--------------------
我想通过程序进行数据库备份,同时开启一个线程用来显示进度条,代码如下。但是当点击按钮进行数据库备份的时候,进度条无法正常显示进度,当数据库备份结束后才显示进度条的进度,清高人指点。
'点击备份按钮事件
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Control.CheckForIllegalCrossThreadCalls = False
th = New Threading.Thread(New Threading.ThreadStart(AddressOf Me.progress))
Dim num As Long = 0
Me.Enabled = False
Me.ProgressBar1.Maximum = 100
Me.ProgressBar1.Minimum = 0
Me.ProgressBar1.Step = 10
Me.ProgressBar1.Value = 0
th.Start()
save()
bFinished = 1
End Sub
'显示进度条
Private Sub progress()
While Me.bFinished <> 1
If ProgressBar1.Value = 100 Then
Me.ProgressBar1.Value = 0
End If
ProgressBar1.Value += 10
Threading.Thread.Sleep(200)
Application.DoEvents()
End While
End Sub
'备份数据库
Private Sub save()
Dim datacomm As New DataComm
datacomm.data_connect()
Dim params() As SqlParameter = {New SqlParameter("@flag", SqlDbType.NVarChar), _
New SqlParameter("@backup_db_name", SqlDbType.NVarChar), _
New SqlParameter("@filename", SqlDbType.NVarChar)}
params(0).Value = "OK"
params(1).Value = "lh_pacs"
params(2).Value = "D:\data\lh_pacs" + CStr(Now.Date)
Directory.CreateDirectory("D:\data")
datacomm.data_executeSP("lh_backup_db", params)
'创建CIniAccess类的对象以书写配置文件和对字符串的加密
Dim oIni As New CIniAccess
'声明变量sPath记录配置文件的路径和文件名
Dim sPath As String = My.Application.Info.DirectoryPath + "\server1.ini"
'服务器IP
Dim server_ip As String = oIni.DecryptDes(oIni.INIRead(sPath, "单机版主机IP", "serverIP"), "12345678", "88888888")
'pacs的版本,如果isServer为“”或“true”,表示单机版;如果isServer为“false”,表示网络版;
Dim isServer As String = oIni.INIRead(sPath, "版本", "isServer")
If isServer = "false" Then '当前版本为网络版
MsgBox("您已经成功备份数据库至" + "\\" + server_ip + "\" + params(2).Value, , "提示!!")
ElseIf isServer = "" Or isServer = "true" Then '当前版本为单机版
MsgBox("您已经成功备份数据库至" + params(2).Value, , "提示!!")
End If
End Sub
------解决方案--------------------
帮你顶
------解决方案--------------------
While Me.bFinished <> 1
If ProgressBar1.Value = 100 Then
Me.ProgressBar1.Value = 0
End If
ProgressBar1.Value += 10
Threading.Thread.Sleep(200)
Application.DoEvents()
End While
如果bFinished不等于1,下面对进度条的操作都不会执行,所以出现“进度条无法正常显示进度,当数据库备份结束后才显示进度条的进度”
因为没有用过进度条,随意说说可以修改的方法。错了误怪:
去掉WHIle条件的判断,在设置了bFinished = 1的地方,停止th线程,设置进度条满格
------解决方案--------------------
严重关注中!
------解决方案--------------------