2017-06-22 19 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

相关问题