2017-06-22 23 views
0

我正在寫一個與CAN總線交互的VB.Net應用程序,以控制其上的一些電機。 利用CAN總線,我可以在正常和反向模式下打開和關閉每個電機,並讀取其電流消耗。 我已經實現了每個電機的兩個複選框,使其運行正常或反向,並顯示實際消耗的文本框,這實際上是工作。 現在我想要做的是automatice一些測試,例如:在不阻擋用戶界面的情況下運行一個任務兩秒鐘

  • 運行每個電機兩秒鐘,每個方向並記錄它的消費,看是否值是正確的。

爲此,我創建了一個TestMotor類,在該類中發送兩個按鈕的參考,這些按鈕在正常或反向每個電機時打開。每個測試等級代表每個電機的測試,所以如果我有4個電機,我將創建4個TestMotor對象,給它們兩個啓動該電機的複選框。

最後,TestMotor類有一個executeTest,它主要通過檢查和取消選中複選框,在兩個方向上運行電機。 這兩秒延遲了它們之間的延遲。

我的問題是,如果我直接在主線程上運行這些測試,Thread.sleep會阻塞UI線程,但是如果我創建一個線程然後執行那些測試,那麼這些測試同時執行。

你會如何解決這個問題?我一直在嘗試使用異步任務,定時器,現在我會嘗試一些信號量或某種東西,但有關解決此問題的最佳方法的一些幫助會很好。

一些代碼:

在主類

for each test in test 
    test.executeTest() 
end for 

TestMotor類

public sub executeTest() 
    ckNormal.checked = true 
    Thread.sleep(2000) 
    ckNormal.checked = false 
    ckReverse.checked = true 
    Thread.sleep(2000) 
    ckReverse.checked = false 
end sub 

謝謝!

回答

0

是的,我也試過,但如果我用異步tasc做Task.Delay,問題是正常和反向模式同時嘗試。最後我做到了這一點:

Private Sub autocheck_btStart_Click(sender As Object, e As EventArgs) Handles autocheck_btStart.Click 
    If Not currentlyTesting Then 
     currentlyTesting = True 
     principal.setRecording(True, ecu) 
     Dim t As Task = Task.Run(Sub() 
            startTesting() 
           End Sub) 
     principal.setRecording(False, ecu) 
     currentlyTesting = False 
    End If 
End Sub 

Public Sub startTesting() 
    For Each test In tests 
     tbDebug.AppendText("Testing motor " + test.getName() + Environment.NewLine) 
     test.executeTest() 
    Next 
    showResults() 
End Sub 

Public Sub executeTest() 
    isTesting = True 
    ckNormal.Checked = True 
    Thread.Sleep(2000) 
    ckNormal.Checked = False 
    Thread.Sleep(200) 
    ckReverse.Checked = True 
    Thread.Sleep(2000) 
    ckReverse.Checked = False 
    Thread.Sleep(200) 
    isTesting = False 
End Sub 

感謝您的意見!

0

不要使用Thread.sleep()使用Task.Delay()

從@StephenCleary THIS THREAD的響應。

當您想要阻止當前線程時使用Thread.Sleep

使用Task.Delay當你想要一個邏輯延遲而不會阻塞當前線程的 。

+0

如果我使用任務。在主線程中延遲,它只是關閉程序,不工作,我認爲這是一個好主意,但要與一個新的線程,然後在這裏我有一個問題,看看如何使主要威脅等待執行新的測試,直到實際還沒有完成。 – rul3s

+0

@ rul3s:你有沒有等待延遲? '等待Task.Delay(2000)' –

+0

是rul32做@VisualVincent所說的,威脅它作爲一個異步任務 – bmvr

相關問題