Hidlibrary 事件线程
Hidlibrary event threads
我正在使用 mikeobriens HIDLibrary 与我们制造的传感器进行通信。
一切正常,我有它,所以如果设备被拔掉然后重新连接,它会重新枚举。
我遇到的问题是,每次重新连接时,都会创建一个新的HidLibrary.HidDeviceEventMonitor.DeviceEventMonitor Worker Thread,如果系统长期处于运行这样的状态,则会创建很多线程。如何在设备断开连接时终止这些线程?
我认为 HidLibrary 存在某种错误。
如果仔细观察 HidDevice class,您可能会发现 HidDevice.CloseDevice 实际上并没有停止事件监视。
有两种方法可以修复它。
在您的应用程序中调用 Dispose 而不是 CloseDevice:
//_device.CloseDevice(); - dispose will close device automatically
_device.Dispose();
或者在 CloseDevice 调用后将标志 MonitorDeviceEvents 设置为 false:
_device.CloseDevice();
_device.MonitorDeviceEvents = false;
我更喜欢第一个。
N.B。还要确保您没有保留对断开连接的设备的引用。
这对我不起作用,因为我正在使用阻塞调用 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 对我不起作用,所以我创建了自己的标志)。关闭的线程收到的下一个事件检测到设备不再是"connected",所以它处理设备,de-references设备,returns 而不调用ReadReport.
我正在使用 mikeobriens HIDLibrary 与我们制造的传感器进行通信。
一切正常,我有它,所以如果设备被拔掉然后重新连接,它会重新枚举。
我遇到的问题是,每次重新连接时,都会创建一个新的HidLibrary.HidDeviceEventMonitor.DeviceEventMonitor Worker Thread,如果系统长期处于运行这样的状态,则会创建很多线程。如何在设备断开连接时终止这些线程?
我认为 HidLibrary 存在某种错误。
如果仔细观察 HidDevice class,您可能会发现 HidDevice.CloseDevice 实际上并没有停止事件监视。
有两种方法可以修复它。 在您的应用程序中调用 Dispose 而不是 CloseDevice:
//_device.CloseDevice(); - dispose will close device automatically
_device.Dispose();
或者在 CloseDevice 调用后将标志 MonitorDeviceEvents 设置为 false:
_device.CloseDevice();
_device.MonitorDeviceEvents = false;
我更喜欢第一个。
N.B。还要确保您没有保留对断开连接的设备的引用。
这对我不起作用,因为我正在使用阻塞调用 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 对我不起作用,所以我创建了自己的标志)。关闭的线程收到的下一个事件检测到设备不再是"connected",所以它处理设备,de-references设备,returns 而不调用ReadReport.