Visual Basic 6 - 是否存在允许实现多线程的库?

时间:2011-05-24 01:51:08

标签: vb6

我是否可以将任何库导入VB6项目以启用多线程支持?我知道有一些使用Windows API的例子,但我想知道是否有任何已经存在的库我可以导入到我的项目中以允许VB6中的此功能。我在VB6中继承了一个非常复杂的应用程序,其任务之一是控制价值数百万美元的机器人手臂。我需要使用此应用程序并进行一些更改,如果我可以添加多线程支持,将会受益匪浅。将这个应用程序转换为.NET将是一项艰巨的任务(对我们来说,一个很好的比喻将相当于明年对火星的载人任务)。该应用程序包括几个执行复杂科学计算和数据分析的自定义库。代码已经过定制,可以提供令人印象深刻的处理速度(这是VB6)。迁移到.NET平台需要大量资源。执行管理层表示,系统升级前可能需要8年时间。我将不胜感激任何回应。

注意:我在提交此问题之前进行了搜索,但我确实看到了一个类似的问题,但问题的答案直接指向Windows API。我的问题有点不同。我问的是已经包含我可以在这个项目中使用的这个功能的库。也就是说,已经完成了使用API​​的所有这些工作的库。

4 个答案:

答案 0 :(得分:2)

我知道没有多线程库。但异步处理不一定需要线程。 Desaware拥有StateCoder,这是一个用于状态机的库,可以在没有多线程的情况下帮助实现多任务处理。有点像Aysnc CTP。

另外,这是一个非常标准的VB6异步后台处理方案。 (例如,它位于Dan Appleman的book和Microsoft的VB6 samples。)您创建了一个单独的ActiveX EXE来完成工作:这样工作就会自动地在另一个线程上,在一个单独的进程中(这意味着你不必担心变量被践踏)。

  • VB6 ActiveX EXE对象应该公开事件CheckQuitDoStuff()。这需要一个名为Quit的ByRef布尔值。
  • 客户端在ActiveX EXE对象中调用StartDoStuff。此例程在隐藏表单上启动Timer,立即返回。这将解锁调用线程。定时器间隔非常短,因此Timer事件会快速触发。
  • Timer事件处理程序禁用Timer,然后回调到ActiveX对象DoStuff方法。这开始了漫长的处理。
  • DoStuff方法会定期引发CheckQuitDoStuff事件。客户端的事件处理程序检查特殊标志,如果需要中止,则设置Quit True。然后DoStuff中止计算并在Quit为True时提前返回。

此方案意味着客户端实际上不需要是多线程的,因为调用线程在“DoStuff”发生时不会阻塞。棘手的部分是确保DoStuff以适当的间隔引发事件 - 太长时间,并且当你想要的时候你不能退出:太短,并且你正在放慢DoStuff的速度。此外,当DoStuff退出时,它必须卸载隐藏的表单。

如果DoStuff确实设法在中止之前完成所有工作,您可以引发一个不同的事件来告诉客户端该工作已完成。

免责声明:direct copy of my answer on another question

答案 1 :(得分:1)

你当然可以调用windows API来实现多线程,它实际上并不复杂。但是,最简单的解决方案是公开.net Com对象并通过.net实现多线程。对于复杂的现有功能,您可以将vb6应用程序拆分为可由多线程.net控制器调用的com库。


[Gui]  ┬> [ .net Com Mulit thread controller]  -> [Com exposed VB 6 utility]
       |
       └> [Com exposed VB 6 utility]

答案 2 :(得分:0)

请参阅文章Using Background Threads with Visual Basic 6以获得问题的优雅答案。

答案 3 :(得分:0)

2002年elitevb制作了一个线程库,现在不幸关闭了。 但是xtremevbtalk上有elitevb文章的存档。 在System and devices部分,底部有一个帖子,附带了threading.dll和示例源代码,这使得实现线程变得非常容易。据我所知,有一个问题,在IDE中测试它会导致程序崩溃,但运行编译程序没有问题。

使用该库,您可以创建非常简单的线程:

Dim ReadValuesThread As Thread

Private Sub Form_Load()
    Set ReadValuesThread = New Thread
    ReadValuesThread.StartThread "ReadValues", "None", Me
    ' Public Function StartThread(FunctionName As String, _
    '                             FunctionParameter As Variant, _
    '                             ParentObject As Object) As Long
End Sub

Private Sub ReadValues()
    ' do things
End Sub

Private Sub Form_Unload(Cancel As Integer)
    ' kill thread
    ReadValuesThread.EndThread
End Sub