2015-07-16 1 views
1

Я использую mikeobriens HIDLibrary для связи с датчиком, который мы делаем.События потока Hidlibrary

Все это работает, и у меня оно есть, поэтому оно переучитывается, если устройство отключено от сети, а затем снова подключено.

Проблема заключается в том, что при каждом повторном подключении создается новый рабочий стол HidLibrary.HidDeviceEventMonitor.DeviceEventMonitor Worker, и если система запускается как это в течение длительного периода времени, создается множество потоков. Как я могу убить эти потоки, когда устройство отключено?

+0

Потратьте время на объяснение своей ситуации. Постепенно код, который вы пробовали ..., что ожидается, будет ... –

+0

Jagadeesh, код предоставляется в HIDLibrary без изменений. – OXO

ответ

0

Я считаю, что существует некоторая ошибка, если HidLibrary.

Если вы посмотрите ближе к классу HidDevice, вы можете обнаружить, что HidDevice.CloseDevice фактически не останавливает мониторинг событий.

Есть два способа исправить это. Либо позвонить Dispose вместо CloseDevice в приложении:

//_device.CloseDevice(); - dispose will close device automatically 
_device.Dispose(); 

или установить флаг MonitorDeviceEvents в ложь после CloseDevice вызова:

_device.CloseDevice(); 
_device.MonitorDeviceEvents = false; 

Я предпочел бы первый.

N.B. Также убедитесь, что вы не держите ссылку на отключенное устройство.

+0

Это исправлено, спасибо – OXO

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.