我正在使用mikeobriens HIDLibrary与我们制作的传感器进行通信。
这一切都正常,我有它所以重新枚举设备是否已拔下插头然后重新连接。
我遇到的问题是,每次重新连接时,都会创建一个新的HidLibrary.HidDeviceEventMonitor.DeviceEventMonitor工作线程,如果系统长时间运行,则会创建许多线程。如何在设备断开连接时终止这些线程?
答案 0 :(得分:0)
我相信如果HidLibrary存在一种错误。
如果仔细观察HidDevice类,您可能会发现HidDevice.CloseDevice实际上并没有停止事件监视。
有两种方法可以修复它。 在您的应用程序中调用Dispose而不是CloseDevice:
//_device.CloseDevice(); - dispose will close device automatically
_device.Dispose();
或者在CloseDevice调用后将标志MonitorDeviceEvents设置为false:
_device.CloseDevice();
_device.MonitorDeviceEvents = false;
我更喜欢第一个。
N.B。另外,请确保您不要保留对已断开连接的设备的引用。
答案 1 :(得分:0)
这对我没有用,因为我正在使用阻塞调用Device.ReadReport(AddressOf OnReport)。如果我只是将设备设置为NULL(以摆脱引用),则下一次扫描会抛出异常。
为了解决这个问题,这就是我所做的:
Public Class myDevice
Private Device As HidDevice
Private isConnected as Boolean
Public Sub Close()
If Not Device Is Nothing Then
Device.CloseDevice()
Device.MonitorDeviceEvents = False
End If
isConnected = False
End Sub
Sub OnReport(Report As HidReport)
If isConnected = False Then
Device.Dispose()
Device = Nothing
Return
End If
' Do stuff with the data
' ...
' ...
' Wait for more data.
Device.ReadReport(AddressOf OnReport)
End Sub
End Class
因此,关闭设备后,线程将处于仍在等待输入的状态。但是......我已经设置了一个标志来指示设备已经关闭(Device.isConnected对我不起作用,所以我创建了自己的标志)。关闭线程收到的下一个事件检测到设备不再连接",因此它处理设备,取消引用设备,并返回而不调用ReadReport 。 / p>