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.