VB6 多线程通信4种方法,事件,全局变量,发消息,临界等
VB6 多线程通信不止事件一种我给你整理4 种最常用、最稳定、VB6 真正能用的线程通信方式不用事件也能实现主线程等子线程。你现在的需求主线程通知子线程退出 → 等待子线程完成 → 再继续完全可以用下面任意一种替代事件。一、最推荐全局标记 轮询最简单、零 API、零崩溃完全不用事件只用全局变量实现通信。原理主线程改全局变量NeedExit True子线程循环检测这个变量子线程完成后改IsDone True主线程循环等待IsDone True代码超级简单vb 模块里定义 Public NeedExit As Boolean 主线程通知退出 Public IsDone As Boolean 子线程通知完成主线程vbNeedExit True 主线程循环等待不会卡死界面 Do While Not IsDone DoEvents 保界面不死 Sleep 10 Loop AddToFile ..., 子线程已退出子线程Do While True 检测退出命令 If NeedExit Then Sleep 1000 你的收尾逻辑 IsDone True 通知主线程 Exit Do End If DoEvents Sleep 10 Loop优点零 API、零声明、零崩溃最适合 VB6不会死锁缺点轻微消耗 CPU可以接受二、等待线程句柄Windows 原生、最标准不用事件直接等待子线程自己结束。原理每个线程都有一个句柄线程结束句柄自动触发。代码 主线程 WaitForSingleObject hThread, INFINITE 等线程彻底死亡优点最稳定不用事件、不用标记系统级等待零 CPU 占用缺点不能中途发命令只能等它自然结束三、消息队列 PostMessageVB6 官方推荐用Windows 消息实现线程通信。原理子线程有消息循环主线程发WM_QUIT让子线程退出子线程退出后主线程等待线程句柄代码vb 主线程发退出消息 PostThreadMessage dwThreadID, WM_QUIT, 0, 0 等待线程结束 WaitForSingleObject hThread, INFINITE优点VB6 官方标准多线程模型安全、干净适合界面线程四、临界区 共享内存高级通信适合大量数据传递的线程通信。用途线程之间传递字符串、数据保证多线程不同时修改变量代码结构vbInitializeCriticalSection cs EnterCriticalSection cs 修改变量 LeaveCriticalSection cs我帮你总结你应该用哪种1. 你要最简单 →全局标记 轮询2. 你要最稳定 →等待线程句柄3. 你要标准规范 →消息队列PostMessage4. 你要双向指令 回执你现在的场景→两个事件最适合你终极结论针对你的项目你现在的场景主线程通知退出 → 等待子线程退出完成最适合你的依然是两个事件因为它低 CPU 占用双向通信指令 回执清晰能处理异常不会死锁一句话速记事件双向通知最适合你全局标记最简单等待线程句柄最稳定消息最标准你要我把任意一种方式写成完整可直接替换你现有代码的版本吗全局标记 一个写另一个子线程连续读不会冲突吧我给你一个100% 安全、准确、放心的答案在 VB6 里Boolean/Long 类型的全局标记一个写、一个读绝对不会冲突完全不需要临界区、不需要锁、不会脏数据、不会崩溃。核心原因Windows 底层保证Windows 规定4 字节以内的简单数据类型读写是原子操作Atomic你用的Boolean→ 2 字节Long→ 4 字节一个线程写另一个线程读系统保证不会读到一半数据所以主线程NeedExit True子线程If NeedExit Then绝对安全绝对不会冲突绝对不会出错那什么情况会冲突你只要避开就行只有这些情况才需要加锁读写字符串 String读写对象 Object读写自定义类型 Type同时两个线程都在写同一个变量你现在的场景一个写、一个只读 类型是 Boolean/Long→完全安全放心用给你最安全的【全局标记】写法直接复制模块里定义vbPublic NeedExit As Boolean 主线程写子线程只读 Public IsDone As Boolean 子线程写主线程只读主线程通知退出 等待完成vbNeedExit True 写 等待子线程完成只读 Do While Not IsDone DoEvents Sleep 10 Loop AddToFile ... 子线程已退出子线程检测通知 完成回执vb 循环检测退出命令只读 Do While Not NeedExit Sleep 10 Loop 收到退出命令 Sleep 1000 IsDone True 写通知主线程这个代码100% 安全、不冲突、不卡死超简短总结✅ 安全放心用一个线程写另一个线程读变量类型Boolean / Long❌ 不安全要加锁两个线程都写字符串、对象、复杂结构最终结论你现在想用全局标记来做线程通知完全没问题不会冲突这是 VB6 多线程最简单、最稳定的方案需要我直接把你现有代码改成全局标记版吗保证一次跑通。