Golden Blonde 发表于 2022-5-23 20:36:05

【VB6】直接使用CreateThread创建多线程的探究

大家都听过“VB6程序不支持多线程”的流言,但大多数人并没有真的测试过。刚才我写了个DEMO测试了一下,发现这是一个“半真半假”的流言,VB6直接使用CreateThread创建多线程是可行的,只不过条件比较苛刻。

先上结论:**** Hidden Message *****测试代码:**** Hidden Message *****

0xAA55 发表于 2022-5-24 00:42:31

那我还用 VB6 干嘛……

tlwh163 发表于 2022-5-24 06:30:23

本帖最后由 tlwh163 于 2022-5-24 07:12 编辑

认真学习

看到以前的学习笔记 说是在线程函数的第一行 插入下面的语句 就可以完美多线程

楼主可以验证一下:

CreateIExprSrvObj 0&, 4&, 0& '加到线程函数的第一句

0xAA55 发表于 2022-5-24 12:32:39

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.不需要远程创建线程...(汗,谁发明的,好厉害,转了好大一个圈)


那就只需要上锁就可以安全多线程了。这一下就都清晰了。

不过具体还是要测试了才知道好不好用。

Golden Blonde 发表于 2022-5-24 14:56:42

tlwh163 发表于 2022-5-24 06:30
认真学习

看到以前的学习笔记 说是在线程函数的第一行 插入下面的语句 就可以完美多线程


这句真是神来之笔!

经测试,在线程函数开头加上这句之后,MsgBox还是不可以用,但是对象的部分属性和方法可以访问了,而且更多的内置函数可以用了(比如Hex$)。

最主要是,不用编译为P-CODE了!!!

W741 发表于 2022-5-24 15:56:36

这个方案支持IDE下调试吗

Golden Blonde 发表于 2022-5-24 17:42:09

W741 发表于 2022-5-24 15:56
这个方案支持IDE下调试吗

极有可能会崩溃。如果要在IDE里调试程序,建议在启动线程之前加上App.LogMode进行判断,多线程相关的代码只有在编译后才运行。

系统消息 发表于 2022-5-24 19:16:52

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

Golden Blonde 发表于 2022-5-24 22:44:13

系统消息 发表于 2022-5-24 19:16
提示一下,这么用是有内存泄露的,正确的用法是:
Declare Function CreateIExprSrvObj Lib "msvbvm60" ( ...

我去,VB6太神奇了,竟然还可以定义不存在的类型。。。

话说在ExitThread之前无需加一句【Set eso = Nothing】么?

Ayala 发表于 2022-5-24 23:51:48

美俪女神 发表于 2022-5-24 22:44
我去,VB6太神奇了,竟然还可以定义不存在的类型。。。

话说在ExitThread之前无需加一句【Set eso = Not ...

定义不存在的类型会当作一个类的指针

0xAA55 发表于 2022-5-25 17:22:27

系统消息 发表于 2022-5-24 19:16
提示一下,这么用是有内存泄露的,正确的用法是:
Declare Function CreateIExprSrvObj Lib "msvbvm60" ( ...

如何“完整初始化”?我想在子线程里面也能 MsgBox

系统消息 发表于 2022-5-25 18:27:00

0xAA55 发表于 2022-5-25 17:22
如何“完整初始化”?我想在子线程里面也能 MsgBox

你想想ActiveX.DLL是怎么实现的多线程初始化?是不是要先DllMain,然后再DllGetClassObject获取对象,而ActiveX.DLL的这俩函数又是调用msvbvm60.dll的VBUserDllMain和VBUserDllGetClassObject,所以是不是可以在标准exe里面调用这俩来完整初始化?
之前,我这网上找到过别人用这方法来初始化的,我试过确实就可以MsgBox和使用Form了,但是要注意VB6那“胎神”会每个线程都会执行一次 Sub Main。

0xAA55 发表于 2022-5-25 20:49:40

系统消息 发表于 2022-5-25 18:27
你想想ActiveX.DLL是怎么实现的多线程初始化?是不是要先DllMain,然后再DllGetClassObject获取对象,而A ...

噗 确实这也是一种变身为“胎神”的方式(

xiawan 发表于 2022-5-26 09:20:50

论坛有你真的精彩~

drlee 发表于 2022-8-11 23:52:03

不确定,再看看

鱼头之王 发表于 2022-8-31 23:36:09

:o:o:o:o:o:o:o

aguai2008 发表于 2023-4-20 00:06:09

非常感谢

liu496324 发表于 2023-7-6 09:48:00

真好,又可以续命30年了

woeoio 发表于 2023-7-7 10:39:19

必须看看

VB-Studio 发表于 2023-8-14 19:47:45

什么?多个消息框?!据我所知,显示消息时程序会暂停!
页: [1] 2
查看完整版本: 【VB6】直接使用CreateThread创建多线程的探究