2013-02-08 197 views
0

我有一個使用標籤的程序調用Valve和一個名爲文本框Variable多線程毛刺

的要點是,如果Variable = 0則標籤顏色是灰色的, 如果Variable = 1則標籤使用一個線程在灰色和紅色之間閃爍。

除非在兩個值之間快速切換(輸入0然後刪除它然後輸入1等等),否則它幾乎可以完美地工作,然後線程速度會增加(就像它是多線程一樣)。

奇怪的是,如果值之間交換0 & 1慢(每2秒+),那麼它不會增加閃爍的速度(這是什麼程序需要做的)

這是從以下問題展開代碼:vb.net multi threading

注意:這只是我的項目在VisiWin.NET上的VB.NET轉換。在這個例子中,文本框Variable將是從PLC讀取的實際變量,並且標籤Valve將是代表來自過程流程模擬的過程螺線管的三角形。每個電磁鐵都將受到不同變量的控制。

Imports Microsoft.VisualBasic 
Imports System 
Imports System.Collections 
Imports System.Collections.Generic 
Imports System.Drawing 
Imports System.Windows.Forms 
Imports System.Threading 
Imports System.Diagnostics 

Public Class Form1 

Private _flash As Boolean = False 

Private Sub Variable1_TextChanged(sender As System.Object, e As System.EventArgs) Handles Variable.TextChanged 


    If Variable.Text = "1" And Not _flash Then 
     _flash = True 
     Dim FlashThread As New Thread(New ThreadStart(AddressOf FlashLabel)) 
     FlashThread.Start() 
    End If 

    If Variable.Text = "0" Then 
     _flash = False 
     Valve.ForeColor = Color.Gray 
    End If 

End Sub 


Private Sub FlashLabel() 

    Dim _Color As Color = Color.Gray 
    While _flash 

     If Valve.ForeColor = _Color Then 
      Valve.ForeColor = Color.Red 
     Else 
      Valve.ForeColor = Color.Gray 
     End If 
     System.Threading.Thread.Sleep(2000) 

    End While 

End Sub 

End Class 

回答

0

的問題如下:

  1. 輸入1,_flashFalse:螺紋開始,改變了顏色,可供2秒
  2. 你進入1後迅速進入0, _flashTrue_flash將被設置爲False
  3. 您在輸入0後快速輸入1,_flashFalse再次啓動一個新線程。

現在,如果在第一個線程休眠時發生第2步和第3步,則有兩個正在運行的線程。第一個線程完成睡眠後,將看到_flashTrue,並且將繼續運行。

+0

乾杯,我有一種感覺是這個問題。有沒有簡單的解決方案?或者對於任何其他代碼來說,變量切換太快以防止多線程問題? –

+0

@GarethAntonyFowell:我認爲肖恩的答案指出要做什麼來阻止它。我同意使用Timer而不是Thread。 –

+0

我以前使用過定時器,但是他們證明是有用的,但是我的項目將會太大,我將不得不使用數百個定時器,我想使用線程來創建我自己的屬性綁定。正常的計時器不適合我的項目規模。 –

3

這裏發生的事情是,你的第一個閃爍的線程仍在運行,它只是在兩秒鐘的睡眠階段。你的值更改爲0,因爲它睡着了,它不會跳出循環,然後變量再次變回1,線程喚醒並繼續進行,到那時你已經產生了另一個線程完成相同的事情,所以看起來好像線程變得更快。

我建議這個不斷變化的定時器來代替,因爲當變量爲0,你可以停止計時,然後重新啓動它時,它是1:

Imports Microsoft.VisualBasic 
Imports System 
Imports System.Collections 
Imports System.Collections.Generic 
Imports System.Drawing 
Imports System.Windows.Forms 
Imports System.Threading 
Imports System.Diagnostics 

Public Class Form1 

Private _timer As New System.Windows.Forms.Timer() 

Private Sub Variable1_TextChanged(sender As System.Object, e As System.EventArgs) Handles Variable.TextChanged 


    If Variable.Text = "1" And Not _flash Then 
     _flash = True 
     _timer.Interval = 2000 
     _timer.Enabled = True 
     _timer.Start() 
    End If 

    If Variable.Text = "0" Then 
     _flash = False 
     _timer.Stop() 
     _timer.Enabled = False 
     Valve.ForeColor = Color.Gray 
    End If 

End Sub 


Private Sub FlashLabel() Handles _timer.Tick 

    Dim _Color As Color = Color.Gray 

    If Valve.ForeColor = _Color Then 
     Valve.ForeColor = Color.Red 
    Else 
     Valve.ForeColor = Color.Gray 
    End If 

End Sub 

End Class 

文檔定時器:http://msdn.microsoft.com/en-gb/library/system.windows.forms.timer.aspx

或者,你可以在線程存儲在一個領域,並終止它,當你的變量設置爲0:

Imports Microsoft.VisualBasic 
Imports System 
Imports System.Collections 
Imports System.Collections.Generic 
Imports System.Drawing 
Imports System.Windows.Forms 
Imports System.Threading 
Imports System.Diagnostics 

Public Class Form1 

Private _flash As Boolean = False 
Private _flashThread as Thread 

Private Sub Variable1_TextChanged(sender As System.Object, e As System.EventArgs) Handles Variable.TextChanged 


    If Variable.Text = "1" And Not _flash Then 
     _flash = True 
     _flashThread As New Thread(New ThreadStart(AddressOf FlashLabel)) 
     _flashThread.Start() 
    End If 

    If Variable.Text = "0" Then 
     _flash = False 
     _flashThread.Abort() 
     Valve.ForeColor = Color.Gray 
    End If 

End Sub 


Private Sub FlashLabel() 

    Dim _Color As Color = Color.Gray 
    While _flash 

     If Valve.ForeColor = _Color Then 
      Valve.ForeColor = Color.Red 
     Else 
      Valve.ForeColor = Color.Gray 
     End If 
     System.Threading.Thread.Sleep(2000) 

    End While 

End Sub 

End Class 

上一個音符見http://msdn.microsoft.com/en-GB/library/ty8d3wta.aspx borting線程,儘管我不認爲這對你真的適用,如果它在休眠期間不中止線程,它應該在下一次循環迭代之前中止。

+0

我以前使用過定時器,但是它們證明是有用的,但是我的項目會過大,我將不得不使用數百個定時器,我想使用線程來創建我自己的屬性綁定。正常的計時器不適合我的項目規模。 –

+0

好吧,你知道你的項目比我好得多,但是定時器將所有這些線程包裝成可能(並不總是)比你做的更好的方式。看起來你正在手動構建這些東西,也許你可以把它包裝在一個輔助類或其他東西中並重新使用它?這只是一個建議=] – Sean

+0

助手類?我如何去做這些之一,因爲我不相信我曾經使用過。 另外它將如何幫助閃爍的問題? –