将颜色更改标记为就绪状态。 VB.NET

时间:2017-05-03 08:04:37

标签: vb.net multithreading label

我有一个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

我错了什么?

1 个答案:

答案 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()

这会强制应用程序在标签上显示更新。最好的仍然是使用多线程操作,但如果你的初学者这个解决方案可以更简单