1

我有一个带有大量 3rd 方库和控件的旧版大型 vb6 编辑器,最近需要对其进行设置以使其成为多线程,以便我可以独立于主编辑器表单运行其他一些表单。基本上,这些其他表单和主编辑器之间的通信最少,除了通过单击主页上的按钮来运行其他表单。

因此,从大量谷歌搜索中,我找到了一种将当前应用程序转换为多线程应用程序的方法,方法是将其设置为 activex exe 并添加一个设置为 global-multi-use 的类以允许这种情况发生。现在在通过调试模式进行编辑和测试时,我发现当我退出时,有时会发生很多奇怪的崩溃。

'main.frm - button click call
'On the button click, create a new object
Set obj = CreateObject("MyApp.clsThread")
Call obj.NewThread

'clsThread
' Create a new form and load it to run on a new thread
Public Sub NewThread()
    Dim frm As Object
    Set frm = New frmDogbert
    Load frmDogbert
    frm.show
    Set frm = Nothing
End Sub

那么当我这样做时,我绝对必须知道什么,即潜在的问题等?因为我担心应用程序似乎变得越来越不稳定。还是有更好的方法来做到这一点?

更新:

我没有强行将我的应用程序破解为伪多线程应用程序,而是听取了这里好人的建议,并将组件重构为标准 exe,并将我的应用程序恢复为标准 exe 并通过 shell 调用它们。工作精美:)

谢谢

4

2 回答 2

2

Visual Basic 6 本身并不是多线程。ActiveX EXE 和 ActiveX DLL 之间的多任务行为差异只有在从另一个 VB6 EXE 引用时才明显。从 ActiveX EXE 中定义的全局多用途类实例化的对象在它们自己的上下文中运行。从 ActiveX DLL 实例化的对象在调用 EXE 的上下文中运行。

现在多线程可以破解到 VB6 中,但它非常棘手并且有很多不该做的(例如,您不能使用 IDE 中的停止按钮来停止调试会话,否则程序将崩溃)。

ActiveX EXE 的好处是生成一个单独但相关的实例,该实例可以在不停止主程序的情况下单独运行。根据您的简短描述,我会说您最好的办法是将您的 EXE 保持原样,但将表单/模块/类更多地保留为单独的 EXE,并让原始 EXE 引用 ActiveX EXE。

请注意,您不必编译为.EXE,您可以将扩展名更改为.DLL,它仍然是一个activeX EXE。这样做是为了让用户不会错误地自行运行 ActiveX EXE。

于 2009-02-25T13:18:41.623 回答
1

你能稍微澄清一下这个问题吗?我不明白为什么它需要多线程?为什么你不能只显示非模态的表单,然后它们都将同时可见和响应。除非您在主窗体中一直在运行一些后台处理,否则从您的问题来看这听起来不太可能,因为它会锁定主窗体以及其他窗体。


Melaos 说:嗯,主编辑器 frm 是这里的主要内容,我需要允许用户运行其他表单来执行其他一些事情,例如将内容上传到我们的服务器并将视频文件转换为其他格式。而这些表单使用 shell 来调用其他 exe。并且运行时间需要相当长的时间。


在这种情况下,我建议将其他形式制作成单独的 EXE,而不是使用多线程,这很困难。您说从主窗体到子窗体的通信很少 - 它只是显示它们。因此,您甚至不需要制作 ActiveX EXE 子表单。只需将它们制作为标准 EXE 并将它们从主窗体中剥离即可。

于 2009-02-25T12:20:13.700 回答