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

Vb6 Visual Basic 6-是否存在允许实现多线程的库?,vb6,Vb6,是否有任何库可以导入到VB6项目中以启用多线程支持?我知道有使用Windows API的示例,但我想知道是否有任何库已经存在,我可以直接导入到我的项目中,以便在VB6中使用此功能。我继承了VB6中一个非常复杂的应用程序,它的任务之一是控制一个价值数百万美元的机械臂。我需要使用这个应用程序并进行一些更改,如果我可以添加多线程支持,这些更改将非常有益。将此应用程序转换为.NET将是一项巨大的任务(对我们来说,一个很好的类比相当于明年的载人火星任务)。该应用程序包括几个自定义库,用于执行复杂的科学计算

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


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

您当然可以调用windows API来实现多线程,而且实际上并没有那么复杂。但是,最简单的解决方案是公开.net Com对象并通过.net实现多线程。对于已经存在的复杂功能,您可以将vb6应用程序分解为com库,多线程.net控制器可以调用这些库

[Gui] ┬> [ .net Com Mulit thread controller] -> [Com exposed VB 6 utility] | └> [Com exposed VB 6 utility] [图形用户界面]┬> [.net Com多线程控制器]->[Com公开VB 6实用程序] | └> [Com公开VB 6实用程序]
据我所知,没有多线程库。但是异步处理不一定需要线程。Desaware有一个状态机库,它有助于在不使用多线程的情况下执行多任务。有点像Aysnc CTP

或者,这里有一个VB6中异步后台处理的标准方案。(例如,它在Dan Appleman和Microsoft的VB6中。)您可以创建一个单独的ActiveX EXE来完成这项工作:这样,这项工作将自动在另一个线程上,在一个单独的进程中进行(这意味着您不必担心变量被践踏)

  • VB6 ActiveX EXE对象应公开事件CheckQuitDoStuff()。这需要一个名为Quit的ByRef布尔值
  • 客户端在ActiveX EXE对象中调用StartTouch。此例程在隐藏窗体上启动计时器,立即返回。这将取消阻止调用线程。计时器间隔非常短,因此计时器事件会快速触发
  • 计时器事件处理程序禁用计时器,然后调用ActiveX对象DoStuff方法。这就开始了漫长的处理过程
  • DoStuff方法定期引发CheckQuitDoStuff事件。客户端的事件处理程序检查特殊标志,并在需要中止时将Quit设置为True。然后,如果Quit为True,DoStuff将中止计算并提前返回
这个方案意味着客户端实际上不需要是多线程的,因为调用线程在“DoStuff”发生时不会阻塞。棘手的部分是确保DoStuff以适当的时间间隔引发事件-时间太长,你不能在你想退出时退出:时间太短,你不必要地减慢了DoStuff。此外,当DoStuff退出时,它必须卸载隐藏的表单

如果DoStuff确实在中止之前完成了所有工作,那么您可以引发另一个事件来告诉客户端作业已完成


免责声明:

请参阅本文,以获得该问题的优雅答案。

2002年,elitevb制作了一个线程库,但不幸的是,该库现已关闭。 但是有一个关于elitevb的文章档案。 在这一部分的底部有一篇文章,附带了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

也许你应该描述一下你所面临的实际问题?(即,不是感知的解决方案)有一个过程控制机械臂。用户将包含预定义指令的文件上载到机械臂。使用硬件专有格式对指令进行编码。这些指令的数量从几十万到两百万不等。下一步涉及到用户接受来自硬件的反馈,即一切正常。现在,硬件支持同时上传多个指令文件,但应用程序不支持。我想将此功能添加到应用程序中,以便使用不同的线程创建多个上载。上载一个通常大小的指令文件是否需要太长时间?这里的“上载”是什么意思?复制到文件共享?TCP上的自定义传输协议?FTP?在任何情况下,我都没有看到任何建议多线程将有所帮助。异步多线程Yep。这是一篇关于使用该组件在VB6中的另一个线程上运行任务的文章。我立即想到ActiveX EXE。除非“线程”必须相互协调,否则应该可以正常工作。当然,我已经在评论中链接到了那篇文章。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分并提供链接