【问题标题】:Setting a manual timeout in VB.NET在 VB.NET 中设置手动超时
【发布时间】:2015-06-13 12:02:11
【问题描述】:

我有一个与一些外部硬件接口的 vb.net 应用程序 - 一组电机控制器。为此,我使用了硬件供应商提供的 CANOpen 库。但是,坦率地说,库中内置的超时时间过长,并导致应用程序在特定条件下痛苦地挂起。如果可能的话,我宁愿不需要编辑库。

在 vb.net 中设计另一个更短的超时时间的最明智的方法是什么?有问题的函数是一个阻塞函数,因此线程内计时器可能无济于事。这里有优雅的解决方案吗?

【问题讨论】:

  • 在不知道库的结构的情况下,不清楚,但我想知道您是否可以创建库的子类并更改超时的持续时间?
  • 如果可以的话,那就太好了,但遗憾的是,就我的专业知识水平而言,图书馆本身同样神秘莫测。超时持续时间似乎不是可供用户更改的参数,并且看起来是硬编码的。
  • 我感受到了你的痛苦。尝试从 VB 中处理任何特定供应商的硬件在很大程度上是一个巨大的痛苦,我对尝试与我最终编写自己的以太网/IP 通信驱动程序的 AB ControlLogix 处理器交谈感到恼火。只是出于兴趣,您想与什么硬件通信?
  • 哈! VB 从一开始就看起来很方便,因为所有的库都在那里,但它并不总是那么简单。我正在尝试与一对重新命名的 Invertek Optidrive 电机 VFD 交谈 - 但具体来说,这些电机并不总是在使用,并且在控制软件运行时并不总是供电。结果是线程挂起 20-30 秒等待建立连接的超时,因为没有其他方法可以确定它们的状态。我想严肃的答案是编写我自己的 CANOpen 'ping' 来检查首先发生了什么,但这听起来很费力。
  • 残酷的事实是VB 方便,但供应商库通常不是 - 他们宁愿你支付相当于英国国家赤字的费用来使用他们的软件!以 AB 为例,5k+ 用于开发许可证,另外 3k 用于我当前项目的运行时。抢劫他们中的很多混蛋。

标签: vb.net multithreading timeout


【解决方案1】:

试一试,这是迄今为止我能想到的最好的。我使用后台工作者只是因为它们易于使用。

基本上,它是线程中的一个线程,至少可以让您的 UI 保持响应,根据您所说的判断,您可能应该为所有驱动器通信功能使用线程,以防驱动器在应用程序期间因任何原因丢失通信正在运行。

这不是很漂亮,但它至少可以让你在 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()

【讨论】:

  • 干杯 - 我以前实际上没有考虑过像这样铺设工人,这更优雅一点。最终解决方案效果很好。
  • 没问题,很高兴我能帮上忙。
猜你喜欢
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 2017-01-30
  • 2013-01-26
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
相关资源
最近更新 更多