【发布时间】:2017-05-03 08:04:36
【问题描述】:
我有一个 Windows 窗体应用程序,我想创建两个状态的“进程”指示器。 我想使用标签来指示子或函数何时运行,背景颜色(绿色、红色)和显示的文本(“OK”、“...”)。
这是下面的简化代码。
名为“Label1”的“指标”标签控件。
我有一些类似于“GridRefresh”的函数和subs。
在 sub 的开头我想将 Label 设置为红色,最后我想将其设置为绿色。
我的问题是,标签永远不会变成红色。
例如GridRefresh 运行 500-1000 毫秒。
我尝试在If Then Else 中设置 2000 毫秒的睡眠时间,但没有任何改变。
Sub GridRefresh()
ReadySwitch(False)
'--do something
....
ReadySwitch(True)
End Sub
Sub ReadySwitch(ready As Boolean)
If ready Then
Label1.BackColor = Color.LightGreen
Label1.Text = "OK"
Else
Label1.BackColor = Color.Red
Label1.Text = "..."
End If
End Sub
我也尝试过多线程,但效果相同。
Sub GridRefresh()
ReadySwitch(False)
'--do something
....
ReadySwitch(True)
End Sub
Sub ReadySwitch(ready As Boolean)
LabelReadyCall(ready)
End Sub
Public t1 As System.Threading.Thread
Sub LabelReadyCall(ByVal ready As Boolean)
t1 = New System.Threading.Thread(AddressOf Me.LabelReadyExecute)
t1.Start(ready)
End Sub
Private Delegate Sub LabelReadyDelegate(ByVal ready As Boolean)
Sub LabelReadyExecute(ByVal ready As Boolean)
If Label1.InvokeRequired Then
Debug.Print("InvokeRequired - state: " & ready )
Label1.BeginInvoke(New LabelReadyDelegate(AddressOf LabelReadyExecute), New Object() {ready})
Else
If ready Then
Label1.BackColor = Color.LightGreen
Label1.Text = "OK"
Else
Label1.BackColor = Color.Red
Label1.Text = "..."
End If
Debug.Print("LabelChange - state: " & ready )
Debug.Print("LabelChange - color: " & Label1.BackColor )
End If
End Sub
在这种情况下,输出窗口的内容是这样的:
InvokeRequired - state: False InvokeRequired - state: True LabelChange - state: False LabelChange - color: Red LabelChange - state: True LabelChange - color: LightGreen
我做错了什么?
【问题讨论】:
-
如果你使用多线程,你需要一个
invoke,否则在更改状态后在单个线程中尝试使用:Application.DoEvents()
标签: vb.net multithreading label