2015-04-08 2 views
1

У меня есть приложение vb.net, которое взаимодействует с каким-то внешним оборудованием - массивом контроллеров двигателя. Для этого я использую библиотеку CANOpen, предоставляемую поставщиком оборудования. Однако тайм-ауты, встроенные в библиотеку, откровенно чрезмерны и заставляют приложение болеть при определенных условиях. Я бы предпочел не редактировать библиотеку, если это возможно.Установка времени ожидания вручную в VB.NET

Какой самый разумный способ дизайна в другом, более короткий тайм-аут в vb.net? Эта функция является блокирующей функцией, поэтому, по-видимому, таймеры в потоке не помогут. Есть ли здесь элегантное решение?

+0

Не зная структуры библиотеки, это неясно, но мне интересно, можно ли создать подкласс библиотеки и изменить продолжительность тайм-аутов? – ChicagoMike

+0

Было бы замечательно, если бы я мог, но, к сожалению, мой уровень экспертизы, сама библиотека является равными частями тайной и непонятной. Длительность тайм-аута, по-видимому, не является параметром, доступным пользователю для изменения и выглядит жестко. – user3896248

+0

Я чувствую вашу боль. Попытка иметь дело с каким-либо конкретным оборудованием поставщиков изнутри VB - это в значительной степени огромная боль в дыре, я получил от этого зла, пытаясь поговорить с процессорами AB ControlLogix, которые в конце концов я написал свой собственный драйвер Ethernet/IP comms. Просто из интереса, с каким оборудованием вы пытаетесь общаться? –

ответ

0

Дайте это попробовать, это лучшее, что я мог придумать до сих пор. Я использовал фоновых работников только потому, что они просты в использовании.

В основном это нить в потоке, которая, по крайней мере, будет поддерживать ваш пользовательский интерфейс, судя по тому, что вы сказали, вероятно, вы должны использовать потоки для всех функций коммуникационных функций в любом случае, если диск теряет связь по какой-либо причине, приложение запущено.

Это некрасиво, но, по крайней мере, вы сможете выйти из него раньше, чем функция CAN сама по себе исчерпала себя.

Private connected As Boolean 

Private Sub bwTryConnect_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bwTryConnect.DoWork 
    Dim timeout As Boolean 
    Dim timeoutCount As Integer 
    Dim timeoutValue As Integer = 5 ' timeout value 
    bwConnect.RunWorkerAsync() ' start worker to try connection 
    While bwConnect.IsBusy And Not timeout 
     Thread.Sleep(1000) ' wait a second 
     timeoutCount += 1 ' increment timeout value 
     If timeoutCount = timeoutValue Then timeout = True ' connection timed out 
    End While 
    ' connected will be true if the try connection worker completed (connection to drive ok) before the timeout flag was set, otherwise false 
    connected = Not timeout 
End Sub 

Private Sub bwConnect_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bwConnect.DoWork 
    ' use your CAN library function here - either a simple connect command or just try reading an arbitary value from the drive 
    ' if you want to test this, uncomment one of the following lines: 
    'Thread.Sleep(20000) ' simulate timeout 
    'Thread.Sleep(2000) ' simulate connect 
End Sub 

Очевидно, что вы звоните по телефону bwTryConnect.RunWorkerAsync().

+0

Cheers - Я на самом деле не рассматривал таких рабочих как раньше, это немного более элегантно. Окончательное решение отлично работает. – user3896248

+0

Без проблем, рад, что я мог бы помочь. –

Смежные вопросы