我有一个Windows窗体应用程序,我想创建两个状态“进程”指示器。 我想使用标签来指示子或功能何时运行,背景颜色(绿色,红色)和显示文本(“OK”,“...”)。
这是下面的简化代码。
名为“Label1
”的“指标”标签控件。
我有一些函数和子函数类似于“GridRefresh
”。
在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
我错了什么?
答案 0 :(得分:1)
对于多线程,您可以尝试这样的事情:
Delegate Sub SetLabel1TextInvoker(ByVal TextToDisplay As String, ByVal colour As Color)
Public Sub SetLabel1Text(ByVal TextToDisplay As String, ByVal colour As Color)
If Label1.InvokeRequired Then
Label1.Invoke(New SetLabel1TextInvoker(AddressOf SetLabel1Text), New Object() {TextToDisplay, colour})
Else
Label1.Text = TextToDisplay
Label1.BackColor = colour
End If
End Sub
然后在ReadySwitch功能中执行以下操作:
Sub ReadySwitch(ready As Boolean)
If ready = true Then
SetLabel1Text("Ok", Color.DarkGreen)
Else
SetLabel1Text(". . .", Color.DarkRed)
End If
End Sub
如果您在单线程应用程序中,可以尝试使用:
Application.DoEvents()
这会强制应用程序在标签上显示更新。最好的仍然是使用多线程操作,但如果你的初学者这个解决方案可以更简单