当前位置: 首页 > news >正文

纯VB6代码实现稳定多线程(源码下载,非ActiveX EXE)

VB6虽然可以通过CreateThread来创建线程,但是创建后的线程里面基本不能调用任何函数,连调用Sleep都会崩溃。到底要怎么做才能让VB6程序稳定运行多线程呢?

一、创建多线程

1. 使用CreateThread创建线程

Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long

通过指定CreateThread的第三个参数 lpStartAddress,来指定线程回调函数的地址。在VB6中可以是用AddressOf + 标准模块内的函数名称 来获取函数的入口地址。

2. 线程回调函数的定义和实现

先看代码,下面代码中的 TheThreadProc 就是线程的回调函数。

Private Function ThisThreadProc(lpData As Long) As Long '第一步必须执行CoInitialize ,要放在代码第一行执行,还需要通过TLB文件引用来静态调用才行 CoInitialize 0& '第二步必须创建一个由VB编写的DLL对象 CreateDummyOject '第三步才能执行自己的线程函数 On Error GoTo ThisThreadProc_Err 100 ThreadMain '第四步执行CoUninitialize和清理 CoUninitialize ExitThread 0 Exit Function ThisThreadProc_Err: MsgBox Err.Description & vbCrLf & _ "in MThreadProc.ThisThreadProc " & _ "at line " & Erl, _ vbExclamation + vbOKOnly, "Application Error" Resume Next End Function '现在可以在这个函数里面做你要做的事情 Private Sub ThreadMain() '一些问题: '不能使用APP对象,也不能创建FORM窗口 '不能调用IWshRuntimeLibrary.WshShell.Run函数 '其他不能使用的功能未知 '怎么调试: '可以使用API函数OutputDebugString来输出信息 '再用工具Dbgview.exe来查看输出的信息 Dim strTmp As String strTmp = "线程ID: " & GetCurrentThreadId & " -> 我可以干活了!" OutputDebugString strTmp End Sub Public Sub CreateDummyOject() '创建任意一个由VB编写的DLL对象,用如下三种方式都可以 Dim obj As Object Set obj = New Dummy ' Set obj = CreateObject("VBMT.Dummy") ' Set obj = CreateDllObject("VBMT.dll", "Dummy") Set obj = Nothing End Sub

在线程回调函数中,我们一共分四步来做,从而实现线程稳定运行。

第一步,必须执行CoInitialize 来初始化COM资源。必须放在所有代码前面的第一行执行,还需要通过TLB文件引用来静态调用才行。

第二步,必须创建一个由VB6编写的,并且已经编译好的ActiveX DLL的对象。创建后可以使用它也可以立即销毁,要的只是创建这个动作而已。具体原因未知,估计是VB6内部初始化了很多东西。

第三步,到这里我们可以在线程做我们想做的工作了。可以正常使用VB6自带的函数和类,调用API,创建和使用其他COM组件。但是不能使用App对象,不能创建Form对象,也不能实例化本工程内定义的类;最多只能调用一次Msgbox函数。

第四部,做完工作,清理一下。先调用CoUninitialize来清理COM占用资源,然后再调用ExitThread退出线程。

完成这四步,我们的程序就可以稳定运行多线程了。

3. 各个系统中测试后的截图

下面依次是在WIN7,WIN10,WIN11中运行的截图。

二、调试多线程

在VB6的开发环境中是无法调试多线程的。我们可以编译后运行,通过输出信息来调试,比如使用API函数OutputDebugString来输出信息,再用工具Dbgview.exe来查看输出的信息。相信每个人都有自己的好办法。

三、问题和建议

线程函数中的第二步说,必须创建一个由VB6编写的,并且已经编译好的ActiveX DLL的对象。如果本来你的程序已经有包含DLL,那可以直接创建已有DLL里面的类即可。 如果本来没有包含DLL,就会无形中增加了一个DLL。

这个问题目前还不知道怎么解决。暂时只能通过其他的办法来变通,比如采用免注册调用DLL的办法,来让程序分发尽量绿色方便。这里我们使用CreateDllObject这个函数来实现,该函定义在类型ThreadAPI.tlb中,具体是用VC在WXVBEX.dll中实现的。

免注册调用COM组件的两种办法https://blog.csdn.net/zezese/article/details/128364347?spm=1001.2014.3001.5502

四、源码下载

源码下载链接 如下,也可以发邮件(31319180@qq.com )来索取源码。

纯VB6代码实现稳定多线程源码https://download.csdn.net/download/Zezese/92711893

请先编译再测试。如果打开工程缺少引用,那就需手动引用一下,VB6菜单->工程->引用->浏览,然后找到源码目录下的ThreadAPI.tlb文件。

http://www.jsqmd.com/news/463459/

相关文章:

  • 商城项目中用到的一些ubuntu系统指令
  • Ren‘Py给不同的角色安排不同的对话框
  • Agent开发学习
  • Crmeb.java项目理解(一)
  • HTB Tracks - REVERSE - SimpleEncryptor
  • Python中继承带来的问题
  • NFTMarket 1 | NFT 简介、业务、技术方案
  • 四字节十六进制转化为单精度IEEE 754 浮点数
  • 打开软件就弹出vccorlib120.dll如何修复? 附免费下载方法分享
  • Ray + LanceDB + Daft 构建大规模向量数据分析管道
  • 计算机软件资格考试——专业英语
  • 没有 Base Code 谈何重构?揭秘智能零零AI论文助手从 0 到 1 的大模型结构化生成引擎
  • 打开软件就弹出vcomp.dll如何修复? 附免费下载方法分享
  • macbookair安装openclaw
  • Ray 集群多用户资源隔离实践
  • MySQL 进阶:库与表的DDL核心操作全指南(含实战案例)
  • 工业 + AI 落地实践:JBoltAI在工业场景的应用解析
  • 打卡信奥刷题(2938)用C++实现信奥题 P5800 [SEERC 2019] Life Transfer
  • 单片机高阻态:数字电路中的“隐形守护者”
  • Qt开发与MySQL数据库教程(一)——配置MySQL
  • 数据|非rag的类人检索
  • Java团队转型AI应用开发:挑战与JBoltAI的破局之道
  • 打卡信奥刷题(2939)用C++实现信奥题 P5810 [SCOI2004] 文本的输入
  • 化学绘图效率革命:InDraw五大核心功能全解析,从OCR识别到CAS号检索的实战指南
  • JBoltAI视频SOP:让“工业+AI”更高效直观
  • Python爬虫实战:监控贝壳找房小区均价与挂牌增量!
  • 物联网毕业设计效率提升指南:基于STM32原理图的模块化设计与快速验证方法
  • Spring Boot WebClient性能比RestTemplate高?看完秒懂!
  • 打卡信奥刷题(2940)用C++实现信奥题 P5815 [CQOI2010] 扑克牌
  • MTools教育应用:智能批改系统开发实战