我正在编写一个与CAN总线交互的VB.Net应用程序,以便控制其上的某些电机。 通过CAN总线,我可以在正常和反向模式下打开和关闭每个电机,并读取它们的电流消耗。 我为每个电机实现了两个复选框,使其正常或反向运行,以及一个显示实际电流消耗的文本框,这实际上是有效的。 现在我想要做的是自动化一些测试,例如:
为此,我创建了一个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 :(得分:0)
请勿使用Thread.sleep()
使用Task.Delay()
来自@StephenCleary THIS THREAD的回复。
如果要阻止当前线程,请使用
Thread.Sleep
。如果您想要一个逻辑延迟而不阻止,请使用
Task.Delay
当前主题。
答案 1 :(得分:0)
是的,我也尝试过,但如果我使用async 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
感谢您的建议!!