VB6的线程模型是什么?

用户名

我正在将一个古老的VB6程序移植到C#/。Net。我不太了解VB6,所以我想让它更好地理解它。

旧的VB6程序具有程序执行的主要过程,但是它具有许多用于套接字事件或计时器事件的事件处理程序,并且这些一旦被唤醒并运行就经常操纵的共享资源(例如,通用全局变量)的处理程序。

尽管如此,旧程序似乎运行正常。

在C#中尝试执行相同的体系结构是灾难性的,因为套接字或计时器的事件处理程序是由系统在与主应用程序线程不同的线程中由系统调用的,并导致频繁的异常,例如“调用线程无法访问该对象,因为拥有不同的线程它。”,更不用说更微妙的问题了。我在转换中的大部分工作是重新构造程序以使其具有线程安全性,并消除了原始程序对全局变量的大量使用。

我的问题是VB6事件处理程序是否在单独的线程中运行?如果是这样的话,VB6是如何摆脱这种情况的呢?VB6程序具有一个计时器,该计时器每4秒唤醒一次,操作一些全局变量,然后返回睡眠状态,而主程序正在执行该操作。我不明白为什么这没有导致冲突。

聪明的新词

Visual Basic中的单元模型线程

如果需要详细的细节,请在COM中研究单元线程模型。VB6基本上使用COM及其内置的隐式线程模型将单个线程视为消息传递实体。它简化了线程安全性,但是在根本上,您将所有方法调用都视为已排队的服务调用,从而牺牲了很多开销。

您的所有代码基本上都在实现COM服务调用的容器中运行。如果您曾经使用过用另一种语言用VB6编写的内容,则通常可以通过COM与它们进行交互。

VB6事件处理程序是否在单独的线程中运行?

并非如此,因为没有单独的线程。您的代码在单个线程上运行,并包裹在我上面描述的类似服务的体系结构中。您所谈论的大多数都是线程化的,是其他COM对象都有自己的单元。因此,为了进行来回通信,当线程彼此通信时,您基本上是在进行RPC调用:您不是直接操纵它们。

VB6程序具有一个计时器,该计时器每4秒唤醒一次,操作一些全局变量,然后返回睡眠状态,而主程序正在执行该操作。我不明白为什么这没有导致冲突。

“计时器”位于为计时器创建的单独线程上,但是当它调用您的代码时,可以保证不中断任何其他函数,因为函数调用基本上在线程中一次排队。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章