委托与线程会冲突吗?
vb.net吧
全部回复
仅看楼主
level 1
蓝梦妖蝶 楼主
我程序里有串口,接收是一个委托。
我新开了一个功能,启动该功能后,下位机以10ms的间隔发10位数据,同时NET程序新开一个线程,这个线程没接收5次数据,记录一下。
现在问题是,数据不停的从串口出来。死活不进线程里运算。难道是委托给截胡了?
2019年03月01日 13点03分 1
level 1
蓝梦妖蝶 楼主
'触发接收事件
Public Sub Sp_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
Me.Invoke(New EventHandler(AddressOf Sp_Receiving)) '调用接收数据函数
End Sub
'接收数据
Private Sub Sp_Receiving(ByVal sender As Object, ByVal e As EventArgs)
Try
'' receivebytes.Text = Str(Val(receivebytes.Text) + SerialPort1.BytesToRead)
If SerialPort.BytesToRead > 0 Then '一个个来时,可能会丢数。
Threading.Thread.Sleep(100) '添加的延时
' Dim strIncoming As String
' strIncoming = SerialPort.ReadExisting.ToString '读取缓冲区中的数据
'SerialPort.DiscardInBuffer()
'COM_txtRE.Text = strIncoming '文本显示
Dim inDataLen As Integer = SerialPort.BytesToRead() '获取可读取的字节数
Dim inBytes(inDataLen - 1) As Byte, bytes As Byte
Dim strHex As String = ""
SerialPort.Read(inBytes, 0, inDataLen) '读取数据
For Each bytes In inBytes
strHex = strHex + [String].Format("{0:X2} ", bytes) '格式化成十六进制(不含&H)
Next
' COM_txtRE.Invoke(RecieveRefresh, strHex) '调用委托,显示接收的数据
COM_txtRE.Text = COM_txtRE.Text & strHex '不清除旧数据
COM_txtRE.SelectionStart = COM_txtRE.Text.Length '显示队尾
COM_txtRE.ScrollToCaret()
' MsgBox(inDataLen)
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
2019年03月01日 13点03分 2
这是串口接收函数,如何在启动线程后关闭他?
2019年03月01日 13点03分
level 1
蓝梦妖蝶 楼主
我把这个串口接收函数删了,也一样不进入线程里的函数。怪事
2019年03月01日 14点03分 3
level 1
蓝梦妖蝶 楼主
Do
If GN_ChkCOM.Checked Then
SerialPort.DiscardInBuffer()
Do
Loop Until SerialPort.BytesToRead >= 60
If SerialPort.BytesToRead > 0 Then
Dim inDataLen As Integer = SerialPort.BytesToRead() '获取可读取的字节数
Dim inBytes(inDataLen - 1) As Byte, bytes As Byte
' Dim strHex As String = ""
SerialPort.Read(inBytes, 0, inDataLen) '读取数据
'For Each bytes In inBytes
' outdata(0) = ([String].Format("{0:X2} ", bytes)) '格式化成十六进制(不含&H)
'Next
For i = 0 To inDataLen - 1
tempdata(i) = inBytes(i) '格式化成十六进制(不含&H)
Next
Dim seloffset_str_list(8) As Integer
For k = 0 To 4
' If tempdata(12 * k - 2) = 14 And tempdata(12 * k - 1) = 10 Then
For i = 0 To 9
seloffset_str_list(i) = tempdata(12 * k + i) '格式化成十六进制(不含&H)
Next
' End If
For i = 0 To 7
offset_str(i) = DecToHex(seloffset_str_list(i), 2)
Next
seloffset = StrToDou64_test(offset_str)
Next
End If
End If
Loop
2019年03月02日 02点03分 4
level 13
委托不会与线程冲突,除非委托的实现不当(仔细看文档才能避免这种问题),或者调用委托的代码(通常是某个框架的代码,不是应用程序项目里面的代码)有问题。常见的处理不当有:死锁、不正确的执行上下文处理(例如,最典型的情况,从线程池里的工作线程调用UI线程的代码写得不对)、异常处理不当。
2019年03月02日 04点03分 5
谢谢。已通过timer的方式解决。定时的去串口buff处理数据
2019年03月02日 06点03分
@蓝梦妖蝶 提醒一下,计时器我印象中有三个实现。一个是通用的实现,在 System.Threading 底下。剩下两种,一种是 Winform 的 Timer,一种是 WPF 和 WinRT 共用的 DispatcherTimer。如果你不清楚它们的区别,建议用后两种。
2019年03月02日 06点03分
@Nukepayload2 谢谢。初学者还有很多东西要学啊
2019年03月03日 05点03分
level 1
蓝梦妖蝶 楼主
已通过timer的方式解决
2019年03月02日 06点03分 6
1