16,554
社区成员
发帖
与我相关
我的任务
分享
Dim autoEvent As New AutoResetEvent(False)
Dim SendingPacket1 As New SendingPacket(10)
Dim i As Long
i = 0
Dim temp As String()
Dim dueTime As Integer
loadInterval()
ThreadItem1 = New System.Threading.Timer(New TimerCallback(AddressOf SimControllSending), autoEvent, 0, 0)
While i <= zzz
autoEvent.WaitOne(999999999, False)
temp = Split(Interval(i), "|")
dueTime = temp(0).Trim()
ThreadItem1.Change(dueTime, 0)
Console.WriteLine("i=" & i & ", " & Interval(i) & "ms")
Console.WriteLine(vbCrLf & "Changing period." & vbCrLf)
i += 1
End While
ThreadItem1.Dispose()
Interval = Nothing
Console.WriteLine(vbCrLf & "Destroying timer.")
Public Sub btnRun_Click(sender As Object, e As EventArgs) Handles btnRun.Click
Dim Thread1 As New System.Threading.Thread(AddressOf toSendPacket)
'Dim Thread2 As New System.Threading.Thread(AddressOf toReceivePacket)
Thread1.Start()
End Sub
Public Sub toSendPacket()
Dim temp, bOutHexTemp As String()
Dim Buf As String
Dim bDataOut As Byte()
Dim Encode1 As Encoding = Encoding.ASCII
Dim SendPer As Integer
SendPer = 0
loadInterval()
While SimControllerSendCount <= zzz
temp = Split(Interval(SimControllerSendCount), "|")
Buf = temp(1).ToString().Trim()
If ChboxHex1.Checked = True Then '以16进制方式发送
bOutHexTemp = Split(Buf, " ")
ReDim bDataOut(bOutHexTemp.Count - 1)
For i = 0 To bOutHexTemp.Count - 1
bDataOut(i) = Val("&H" & bOutHexTemp(i))
Next
SendPer = bDataOut.GetLength(0)
Else '以ASCII码方式发送
bDataOut = Encode1.GetBytes(Buf)
SendPer = bDataOut.GetLength(0) '发送总字节数
End If
iSentCount += SendPer
labelSentBytes.Text = iSentCount
RS232.Write(bDataOut, 0, SendPer)
SimControllerSendCount += 1
'把在com1上发送的报文写入DataGridView2中
Dim dr As DataRow = dt2.NewRow()
dr(0) = mPortName
dr(1) = Format(Now(), "hh:mm:ss") & "." & Microsoft.VisualBasic.Right("0" & Now().Millisecond.ToString(), 3) & "s"
dr(2) = Buf
dt2.Rows.Add(dr)
Me.DataGridView2.DataSource = dt2
Threading.Thread.Sleep(temp(0))
End While
End Sub
然后偷懒用
CheckForIllegalCrossThreadCalls = False '允许跨线程运行
现在能出现原来期望的效果,但是这个线程做完工作,用什么语句来结束呢?dim a = 1
dim b = a +1
你偏要降地一条代码放到一个子线程中,然后第二条代码在另一个线程(包括UI主线程),然后在第二条代码之前用一个 WaitOne 语句来阻塞着,这有意义吗?
这是非常恶劣的 WaitOne 用法。这用线程语法,模拟着顺序同步操作,是无意义的。
Dim ThreadItem1 As System.Threading.Timer
ThreadItem1 = New System.Threading.Timer(Sub()
SimControllSending(xxxx)
temp = Split(Interval(i), "|")
dueTime = temp(0).Trim()
Console.WriteLine("i=" & i & ", " & Interval(i) & "ms")
Console.WriteLine(vbCrLf & "Changing period." & vbCrLf)
i += 1
If i <= zzz Then
ThreadItem1.Change(Threading.Timeout.Infinite, Threading.Timeout.Infinite)
Console.WriteLine(vbCrLf & "Destroying timer.")
Else
ThreadItem1.Change(dueTime, 0)
End If
End Sub)
纠结于线程之间相互纠缠,是个很悲哀的事情。你可以看到,根本没有必要用什么 AutoResetEvent 信号机制,根本没有必要写 while 语句,根本也没有必要写 WaitOne 代码。纯粹是自己干扰自己。