当另一个线程循环正在等待条件变为真时,Thead停止

时间:2019-01-25 15:09:00

标签: vb.net multithreading loops

我希望我的代码始终在线程中读取某些条件,例如读取编码器的位置。

在并行运行中,我需要对步进电机执行一个命令,使其转到一个位置并等待,直到到达该位置,才将输出位设置为“ 1”。但是,当我启动“位置未到达”循环时,它将停止读取位置并初始化txtPosXtxtPosY的线程。

我已经试过doevents()thread.sleep(time)来查看是否在睡眠时,其他代码从另一个读取X和Y轴的代码中执行了一些指令。

Imports System.Threading

Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ThreadPool.QueueUserWorkItem(AddressOf trdReadAxis)
End Sub

Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
    ThreadPool.QueueUserWorkItem(AddressOf trdStartJob)
End Sub

Private Delegate Sub delegate1()

Private Sub trdReadAxis()
    Do While true
        If InvokeRequired Then
            Dim d As New delegate1(AddressOf trdReadAxis)
            Invoke(d, Nothing)
        Else
            TPX = lib1.command("TELL POSITION X")
            TPY = lib1.command("TELL POSITION Y")
            txtPosX.text = TPX
            txtPosY.text = TPY
        End If
    Loop
End Sub

Private Sub trdStartJob()
    If InvokeRequired Then
        Dim d As New delegate1(AddressOf trdStartJob)
        Invoke(d, Nothing)
    Else
        lib1.command("GO X TO POSITION 100")
        lib1.command("GO y TO POSITION 200")
        Dim contIntX As Integer = 100
        Dim contIntY As Integer = 200
        While movIsComp = False
            Thread.Sleep(200)
            If TPX = contIntX And TPY = contIntY Then
                movIsComp = True
            End If
            Application.DoEvents()
        End While
        #do other stuffs
    End If
End Sub

End Class

可以预期,当trdStartJob()在while循环中等待位置时,trdReadAxis()使文本框实例化。但是我已经冻结了txtPosXtxtPosY

所以我需要等待循环达到"movIsComp = True"的条件,才能看到txtBoxes展示它们应该显示的内容。

(对不起我的英语不好,我正在努力提高...)

0 个答案:

没有答案