我有一个传统的大规模vb6编辑器,有很多第三方库和控件,最近需要设置它以使其成为多线程,所以我可以独立于主编辑器表单运行一些其他表单。基本上,这些其他表单和主编辑器之间的通信最少,除了从主页面单击按钮运行其他表单。
因此,通过大量的谷歌搜索,我发现了一种方法,通过将当前应用程序设置为activex exe并将类集添加到全局多用途来将当前应用程序转换为多线程应用程序以允许这种情况发生。现在,在通过调试模式进行编辑和测试时,我发现当我退出时,有时会发生很多奇怪的崩溃。
'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调用它们。工作得很漂亮:)。
谢谢
答案 0 :(得分: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。
答案 1 :(得分:1)
你能澄清一下这个问题吗?我不明白为什么它需要多线程?为什么你不能只显示非模态的表格,然后它们将同时显示和响应。除非您在主表单中一直处理一些后台处理操作,否则您的问题听起来不太可能,因为它会锁定主表单以及其他表单。
Melaos说:主要编辑器frm是主要的东西,我需要允许用户运行其他表单来做一些其他的事情,比如将内容上传到我们的服务器并将视频文件转换为其他格式。而这些表单使用shell来调用其他exes。运行时间需要很长时间。
在这种情况下,我建议将其他表单分成单独的EXE,而不是使用多线程,这很困难。你说从主窗体到子窗体的通信很少 - 它只是显示它们。因此,您甚至不需要制作ActiveX EXE的子表单。只需将它们作为标准EXE并从主窗体中填充它们。
答案 2 :(得分:0)
不要这样做。即使使用适用于它的工具,多线程也是非常复杂的。