【VB6】直接使用CreateThread创建多线程的探究
大家都听过“VB6程序不支持多线程”的流言,但大多数人并没有真的测试过。刚才我写了个DEMO测试了一下,发现这是一个“半真半假”的流言,VB6直接使用CreateThread创建多线程是可行的,只不过条件比较苛刻。先上结论:**** Hidden Message *****测试代码:**** Hidden Message ***** 那我还用 VB6 干嘛…… 本帖最后由 tlwh163 于 2022-5-24 07:12 编辑
认真学习
看到以前的学习笔记 说是在线程函数的第一行 插入下面的语句 就可以完美多线程
楼主可以验证一下:
CreateIExprSrvObj 0&, 4&, 0& '加到线程函数的第一句 tlwh163 发表于 2022-5-24 06:30
认真学习
看到以前的学习笔记 说是在线程函数的第一行 插入下面的语句 就可以完美多线程
牛逼!我照着你给的这个东西搜索了一下,发现了这个帖子:
https://www.vbgood.com/forum.php?mod=viewthread&tid=92847
函数声明如下:
Public Declare Function CreateIExprSrvObj Lib "msvbvm60.dll" (ByVal p1_0 As Long, ByVal p2_4 As Long, ByVal p3_0 As Long) As Long
按照原帖子的内容:
1.不需要写tlb库(感觉麻烦了,使用tlb主要是防止vb设置err.lastDllerr),
2.不需要处理tls(很多都是暴力copy,不知道有没有后遗症?)
3.不需要编译成activx exe(这东东会在注册表留下垃圾项,从VB的引用中会看到),
4.不需要编译成p-code(P代码的坏处众所周知了)
5.不需要干掉 setSysXXXerr(干掉后 err.lastDllErr肯定无效啦,不爽)
6.不需要远程创建线程...(汗,谁发明的,好厉害,转了好大一个圈)
那就只需要上锁就可以安全多线程了。这一下就都清晰了。
不过具体还是要测试了才知道好不好用。 tlwh163 发表于 2022-5-24 06:30
认真学习
看到以前的学习笔记 说是在线程函数的第一行 插入下面的语句 就可以完美多线程
这句真是神来之笔!
经测试,在线程函数开头加上这句之后,MsgBox还是不可以用,但是对象的部分属性和方法可以访问了,而且更多的内置函数可以用了(比如Hex$)。
最主要是,不用编译为P-CODE了!!! 这个方案支持IDE下调试吗 W741 发表于 2022-5-24 15:56
这个方案支持IDE下调试吗
极有可能会崩溃。如果要在IDE里调试程序,建议在启动线程之前加上App.LogMode进行判断,多线程相关的代码只有在编译后才运行。 tlwh163 发表于 2022-5-24 06:30
认真学习
看到以前的学习笔记 说是在线程函数的第一行 插入下面的语句 就可以完美多线程
提示一下,这么用是有内存泄露的,正确的用法是:
Declare Function CreateIExprSrvObj Lib "msvbvm60" (Optional ByVal Reserved As Long, Optional ByVal Size As Long = 4, Optioanl ByVal Fail As Boolean) As IUnknown
Function 线程入口函数(ByVal 线程参数 As Long) As Long
Dim eso As IUnknown
Set eso = CreateIExprSrvObj() '提示:需要用IUnknown类型局部变量保存此对象,这样可以在入口函数的作用域生命周期结束后自动释放。
… … '你真的线程处理代码
End Function 系统消息 发表于 2022-5-24 19:16
提示一下,这么用是有内存泄露的,正确的用法是:
Declare Function CreateIExprSrvObj Lib "msvbvm60" ( ...
我去,VB6太神奇了,竟然还可以定义不存在的类型。。。
话说在ExitThread之前无需加一句【Set eso = Nothing】么? 美俪女神 发表于 2022-5-24 22:44
我去,VB6太神奇了,竟然还可以定义不存在的类型。。。
话说在ExitThread之前无需加一句【Set eso = Not ...
定义不存在的类型会当作一个类的指针 系统消息 发表于 2022-5-24 19:16
提示一下,这么用是有内存泄露的,正确的用法是:
Declare Function CreateIExprSrvObj Lib "msvbvm60" ( ...
如何“完整初始化”?我想在子线程里面也能 MsgBox 0xAA55 发表于 2022-5-25 17:22
如何“完整初始化”?我想在子线程里面也能 MsgBox
你想想ActiveX.DLL是怎么实现的多线程初始化?是不是要先DllMain,然后再DllGetClassObject获取对象,而ActiveX.DLL的这俩函数又是调用msvbvm60.dll的VBUserDllMain和VBUserDllGetClassObject,所以是不是可以在标准exe里面调用这俩来完整初始化?
之前,我这网上找到过别人用这方法来初始化的,我试过确实就可以MsgBox和使用Form了,但是要注意VB6那“胎神”会每个线程都会执行一次 Sub Main。 系统消息 发表于 2022-5-25 18:27
你想想ActiveX.DLL是怎么实现的多线程初始化?是不是要先DllMain,然后再DllGetClassObject获取对象,而A ...
噗 确实这也是一种变身为“胎神”的方式( 论坛有你真的精彩~ 不确定,再看看 :o:o:o:o:o:o:o 非常感谢 真好,又可以续命30年了 必须看看 什么?多个消息框?!据我所知,显示消息时程序会暂停!
页:
[1]
2