VB 6 多线程混淆

Posted

技术标签:

【中文标题】VB 6 多线程混淆【英文标题】:VB 6 Multi-threading confusion 【发布时间】:2016-05-03 13:20:38 【问题描述】:

我的问题是关于 VB 6 中的多线程。这似乎是一个过时的问题,因为现在使用 VB 6 的人越来越少。

当然,原生 VB 6 不直接支持多线程。因此,我创建了一个 C++ dll,并公开了一个调用 CreateThread 来创建工作线程的方法和一些其他方法来控制线程。线程似乎很好。

为了通知 VB 6 应用程序,我首先将 Me.hWnd 传递给 dll 并在创建线程之前挂钩 WndProc。然后,在需要的地方调用 SendMessage 到 hWnd。好像还可以。

这种方法在 VB 6 中使用多线程是否稳定?我真的需要你的帮助!

PS:SHCreateThread API 代替 CreateThread 怎么样?

【问题讨论】:

您必须在创建hWnd 的线程上调用SendMessage。你所做的事情在你投入生产的那一刻就会烟消云散。 (仅供参考,VB6 支持通过 ActiveX EXE 进行线程化。) @wqw SendMessage(我将其更改为 PostMessage 以防止潜在的阻塞)在 C++ 线程而不是“UI”(或主)线程上调用。我想消息是跨线程发送的。为什么你认为它不起作用? 有关 VB6 如何处理线程的概述(带有进一步阅读的链接),请参阅this。 “进程内组件”是一个 ActiveX DLL。 “进程外组件”是一个 ActiveX EXE。 @BobRodes Emm。它们都有局限性。我即将使用我的 .dll 方法,因为我认为“如果我调用 Windows 系统 API,其中一些可能会在其中创建新线程。VB 6 能够调用这些类型的 API 意味着在 .dll 中创建线程是安全的”和“Windows 消息方法与 COM 合同无关(因此,它是安全的),它肯定是线程安全的方法。” 是的,这种自定义编组应该可以解决问题。它的性能不是很好(有点像在每个方法调用上都使用堆分配/释放)并且不是很方便(没有等效的输出参数,因此工作线程例如无法接收取消请求)但应该足够稳定,除非发布的消息是VB6 线程错过了,堆泄漏开始累积。 【参考方案1】:

我不确定您的 .dll 方法,但实际上您可以在 VB6 中使用一些技巧来创建额外的线程。如果您在表单上放置一个计时器对象,将其设置为在 1 毫秒内触发,触发的 timerevent 将在单独的线程中。从那里你可以调用你需要的任何其他函数。我以前经常使用这个技巧来进行后台处理等等。

专业提示:立即停用计时器,一旦它触发或将发生混乱。

【讨论】:

这种方式可以启动线程,但之后无法控制。 @guanboshen 从来没有使用 VB6 计时器控件启动线程。

以上是关于VB 6 多线程混淆的主要内容,如果未能解决你的问题,请参考以下文章

vb.net 多线程 访问界面控件

VB中的多线程

VB.net 如何设计多线程运行

vb中的timer\多线程有关问题

求教VB.net多线程问题

Java多线程编程中易混淆的3个关键字( volatileThreadLocalsynchronized)总结