朋友们端午节快乐!问个关于多线程的问题,不难
我在学习线程委托的时候发现一个很好玩的问题。
将下面代码复制粘贴到一个新的工程中,Form中加入两个标签,一个按钮,不用改名字,就可以运行看效果。
效果是:点按钮以后,两个标签在动态显示数字。姑且不考虑i最后超出integer范围,就是个例子而已。
我的问题是:我发现在thread1和thread2中至少某一个里面要有一个有sleep,否则会出现界面卡死状态,但是CPU还是在运转,而标签不再动态显示数字了,请问这是为什么呢。想不用sleep,让这两个标签都在动态显示数字有什么方法吗?
谢谢大家!
Public Class Form1
Private Delegate Sub WeiTuo(ByVal str As Integer)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim t1 As Threading.Thread = New Threading.Thread(AddressOf Thread1)
t1.Start()
Dim t2 As Threading.Thread = New Threading.Thread(AddressOf Thread2)
t2.Start()
End Sub
Private Sub Thread1() '控制前端显示
Dim wt As New WeiTuo(AddressOf ShowData)
Dim i As Integer
While True
i = i + 1
Me.Invoke(wt, i)
'System.Threading.Thread.Sleep(10) '在thread1和thread2中至少要有一个sleep,才能正常显示
End While
End Sub
Private Sub Thread2() '控制前端显示
Dim wt As New WeiTuo(AddressOf ShowData2)
Dim i As Integer
While True
i = i + 1
Me.Invoke(wt, i)
'System.Threading.Thread.Sleep(1) '这句也去掉的话,则UI线程界面卡死,但是CPU还在运转
End While
End Sub
Private Sub ShowData(ByVal str As Integer)
Label1.Text = str
End Sub
Private Sub ShowData2(ByVal str As Integer)
Label2.Text = str
End Sub
End Class
[解决办法]
我想这个是因为UI是单线程的缘故,同时更新2个UI控件必须有时差,这2个可以同时使用异步委托就能同时运行,不须写线程等待语句.
公历→农历
2013年06月11日
双子座
二〇一三年五月初四
癸巳〖蛇〗,戊午月,戊申日,辛酉时
今属:土;五行:水火土金;缺:木。
纳音五行:长流水。
------解决方案--------------------
你这个例子仅具有理论上的价值,如果不想卡死,又想界面能响应,试试下面的更改
If i Mod 100000 = 0 Then
Me.Invoke(wt, i)
End If
Label1.Text = str
Label1.Refresh()
现在你明白界面为什么卡死了,窗体大部分时间都用来更新Label1.text和Label2.text了,当然无法响应
[解决办法]