vb.net多线程,循环导致窗口界面假死的问题
程序中有一个ProgressBar定义有变量:DimiasintegerDelegateSubdeSomeSub()DimTAsSystem.Threading.Thre...
程序中有一个ProgressBar
定义有变量:
Dim i as integer
Delegate Sub deSomeSub()
Dim T As System.Threading.Thread
过程:
Sub SomeSub()
For i = 0 To ListView1.Items.Count - 1
Dim b As Bitmap = Bitmap.FromFile("文件路径")
Dim a As Bitmap = ZommPictureto480(b)
a.Save("存储路径", System.Drawing.Imaging.ImageFormat.Jpeg)
b.Dispose()
a.Dispose()
ProgressBar.PerformStep()
Next
End Sub
Sub BeginDoSub()
Dim s As New deSomeSub(AddressOf SomeSub)
Me.Invoke(s)
End Sub
Button点击事件:
Sub Click
ProgressBar.Maximum = ListView1.Items.Count
T = New Threading.Thread(New Threading.ThreadStart(AddressOf SomeSub))
T.Start()
End Sub
'---------------------------------------------------------------
上面程序在执行的时候一旦ListView中的项目很多,进行多次循环的时候(大概在100次左右)就会使窗口界面假死,无法进行操作,但是程序仍然是在运行中。不知道有哪位知道这是什么问题吗?
Button点击事件中应该是:
T = New Threading.Thread(New Threading.ThreadStart(AddressOf BeginDoSub))
本来就是要运行速度最快,还设置停顿? 展开
定义有变量:
Dim i as integer
Delegate Sub deSomeSub()
Dim T As System.Threading.Thread
过程:
Sub SomeSub()
For i = 0 To ListView1.Items.Count - 1
Dim b As Bitmap = Bitmap.FromFile("文件路径")
Dim a As Bitmap = ZommPictureto480(b)
a.Save("存储路径", System.Drawing.Imaging.ImageFormat.Jpeg)
b.Dispose()
a.Dispose()
ProgressBar.PerformStep()
Next
End Sub
Sub BeginDoSub()
Dim s As New deSomeSub(AddressOf SomeSub)
Me.Invoke(s)
End Sub
Button点击事件:
Sub Click
ProgressBar.Maximum = ListView1.Items.Count
T = New Threading.Thread(New Threading.ThreadStart(AddressOf SomeSub))
T.Start()
End Sub
'---------------------------------------------------------------
上面程序在执行的时候一旦ListView中的项目很多,进行多次循环的时候(大概在100次左右)就会使窗口界面假死,无法进行操作,但是程序仍然是在运行中。不知道有哪位知道这是什么问题吗?
Button点击事件中应该是:
T = New Threading.Thread(New Threading.ThreadStart(AddressOf BeginDoSub))
本来就是要运行速度最快,还设置停顿? 展开
2个回答
展开全部
同学。。你这里的写法其实根本没有用到多线程
原因很简单
你是定义了一个T的新线程,但是很可惜你在BeginDoSub这个独立的线程中又定义了一个deSomeSub的委托,并且直接用Me.Invoke把实际的执行任务提交给界面主线程运行了
所以你的图片的处理函数实际上是在主线程中运行的,新线程等于没用
正确的作法是,T定义为SomeSub这个函数为入口的线程,并启动它
在界面进度条更改的时候再使用Invoke来调用委托来进行界面更改。
自己再好好看看吧,时间问题我要走了。
原因很简单
你是定义了一个T的新线程,但是很可惜你在BeginDoSub这个独立的线程中又定义了一个deSomeSub的委托,并且直接用Me.Invoke把实际的执行任务提交给界面主线程运行了
所以你的图片的处理函数实际上是在主线程中运行的,新线程等于没用
正确的作法是,T定义为SomeSub这个函数为入口的线程,并启动它
在界面进度条更改的时候再使用Invoke来调用委托来进行界面更改。
自己再好好看看吧,时间问题我要走了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询