2017-05-03 6 views
0

나는 창문 양식 응용 프로그램을 가지고 있으며, 두 개의 "프로세스"표시기를 만들고 싶습니다. 배경색 (녹색, 빨간색) 및 표시된 텍스트 ("OK", "...")를 사용하여 하위 또는 기능이 실행 중인지 여부를 나타 내기 위해 레이블을 사용하고 싶습니다.레이블 백 색이 준비 상태로 변경됩니다. VB.NET

다음은이 간단한 코드입니다. "표시기"레이블 컨트롤은 "Label1"입니다. "GridRefresh"과 비슷한 기능과 서브가 있습니다.

하위의 시작 부분에서 Label을 빨간색으로 설정하고 끝 부분을 녹색으로 설정하고 싶습니다.

내 문제는 라벨이 절대로 빨간색으로 바뀌지 않는다는 것입니다. 예를 들어, GridRefresh은 500-1000ms 동안 실행됩니다. If Then Else에 2000ms의 잠자기를 시도했지만 아무 것도 변경되지 않았습니다.

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 

멀티 스레딩을 시도했지만 동일한 효과가 있습니다.

InvokeRequired - state: False 
InvokeRequired - state: True 
LabelChange - state: False 
LabelChange - color: Red 
LabelChange - state: True 
LabelChange - color: LightGreen 

내가 잘못 무엇을 :

이 경우
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 

출력 윈도우의 내용이 무엇입니까? 멀티 스레딩에 대한

+0

멀티 스레딩을 사용하는 경우 변경 직후에 하나의 스레드에서 '호출'해야 할 필요가 있습니다 :'' Application.DoEvents()' – Mederic

답변

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

이는 응용 프로그램이 레이블에 업데이트를 표시하도록합니다. 가장 좋은 점은 멀티 스레드 작업을 사용하는 것입니다. 그러나 초보자가이 솔루션을 더 간단하게 사용할 수 있다면

+0

시도해 줘서 고맙겠지 만 같은 결과 :/ – norbre

+0

나는 초보자 다. 그래서 멀티 스레딩은 나에게 새로운 것이다. 어딘가에 스레드 나 다른 것을 끝내야합니까? – norbre

+0

내 코드를 실행할 때 문제가 정확히 무엇입니까? 나는 수천 개의 파일을 거치면서 레이블을 업데이트하기 위해 내 소프트웨어에서이 파일을 사용합니다. 내가 준 코드를 넣은 다음,'ReadySwitch (False)'와 서브의 시작과'ReadySwitch (True)'를 끝에 추가하십시오. 그러나이 작업은 하위 작업자와 같은 새로운 스레드에있는 경우에만 작동합니다. 'ReadySwitch' – Mederic