VB6 的线程模型是什么?

2024-07-04

我正在将一个古老的 VB6 程序移植到 C#/.Net。我不太了解VB6,我问这个是为了更好地理解它。

旧的VB6程序有一个程序执行的主过程,但是它also有许多用于套接字事件或计时器事件的事件处理程序,以及这些经常操纵的共享资源(例如,公共全局变量)的处理程序,每当它们醒来并运行时。

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

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

我的问题VB6 事件处理程序在单独的线程中运行吗?如果是这样的话,VB6 是如何摆脱这个问题的呢?除此之外,VB6 程序有一个计时器,每 4 秒醒来一次,操作一些全局变量并返回睡眠状态,而主程序则在做它的事情。我不明白为什么这没有导致冲突。


Visual Basic 中的单元模型线程 http://msdn.microsoft.com/en-us/library/aa261361%28v=vs.60%29.aspx

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

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

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

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

除此之外,VB6 程序有一个计时器,每 4 秒醒来一次,操作一些全局变量并返回睡眠状态,而主程序则在做它的事情。我不明白为什么这没有导致冲突。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VB6 的线程模型是什么? 的相关文章

  • 调试调用 .Net(C#) dll 的 VB6 项目

    我已经被这个问题困扰了几个小时了 我希望有人遇到过类似的问题 我们使用 VS2010 开发了一个原型 Net C dll 并希望能够在 C 应用程序和 VB6 应用程序中调用该 dll 我的问题是 是否可以调试调用 Net dll 的 VB
  • VB6中判断一个字符是否为字母的最佳方法是什么?

    需要一个函数 该函数接受一个字符作为参数 如果是字母则返回 true 这是发布的代码的一部分rpetrich https stackoverflow com users 4007 rpetrich响应一个question https sta
  • 从 SynchronizationContext 派生

    简而言之 我实现了一个从 SynchronizationContext 派生的类 以便 GUI 应用程序可以轻松地使用 GUI 线程以外的线程上引发的事件 我非常感谢对我的实施提出评论 具体来说 有什么是您建议反对的或可能会导致我未预见到的
  • std::thread <未解析的重载函数类型> 错误

    我试图从我的类中生成一个线程 并且该线程在我的类中执行特定的方法 代码如下所示 class ThreadClass int myThread int arg do something void createThread thread t t
  • 原子/易失性/同步之间有什么区别?

    原子 易失性 同步内部如何工作 下面的代码块有什么区别 Code 1 private int counter public int getNextUniqueIndex return counter Code 2 private Atomi
  • 无锁多线程编程会让事情变得更容易吗?

    我只读了一点关于这个主题的内容 但似乎唯一的好处是解决争用问题 但它不会对死锁问题产生任何重要影响 因为无锁的代码是如此之小和基本 fifos lifos hash 从来没有出现过死锁问题 所以一切都与性能有关 这是正确的吗 无锁编程 据我
  • Qt:将事件发布到 QThread 的正确方法?

    在我的 Qt 应用程序中 我有一个主线程和一个工作线程 工作线程子类QThread并通过处理事件customEvent 这是主线程发送要由工作线程处理的事件的正确方法吗 QThread myWorkerThread QApplication
  • C# 中线程之间发送消息

    如何在线程之间发送和接收消息 例如 一种解决方案是共享并发队列 尽管它的名称 并发队列 http msdn microsoft com en us library dd267265 aspx 这将允许您将一个对象从一个线程入队 并让另一个线
  • UIProgressView 没有更新?

    我已经开始在 iOS5 中使用 UIProgressView 但还没有真正使用它 我在更新视图时遇到问题 每次更新进度后 我都有一组连续的操作 问题是 进度视图不是一点一点更新的 而是在全部完成之后才更新 事情是这样的 float cnt
  • 关闭Python线程以防止内存泄漏

    如何关闭 Python 线程以确保线程内内存中的所有内容都从内存中清除 目前 我有一个通过以下方式加入的线程列表 for t in threadlist t join 5 这些线程最初是通过循环传递给每个线程的参数列表来创建的myfunc它
  • 计时器计划与scheduleAtFixedRate?

    public class MyTimerTask extends TimerTask Override public void run int i 0 try Thread sleep 100000 catch InterruptedExc
  • 我可以在没有 ExecutorService 的情况下使用 Callable 线程吗?

    我可以在没有 ExecutorService 的情况下使用 Callable 线程吗 我们可以在没有 ExecutorService 的情况下使用 Runnable 的实例和 Thread 的子类 并且此代码可以正常工作 但这段代码始终有效
  • 如何在Rails启动时创建线程?

    我试图在 Rails 启动时创建一个线程 该线程将在应用程序的整个生命周期中运行 奇怪的是 我已经将其与我正在运行的另一个线程一起使用了 我复制了该 工作 代码并将其用作新线程的新代码的样板 但线程不会启动 代码位于配置 初始化程序中 这是
  • ManualResetEvent WaitOne 未解锁

    我对我正在使用的 ManualResetEvent 有点困惑 它似乎没有解锁 有谁知道为什么会出现这种情况 我得到的场景就是这样的 真实的情况相当复杂 我还没有成功地隔离出一段可以合理发布来重现问题的代码 EDIT我更新了下面的代码示例 这
  • Java 从多次调用中收集 CompletableFuture 的结果

    我必须运行多个外部调用操作 然后以列表的形式获取结果 我决定使用CompletableFutureapi 我准备的代码相当恶心 这个例子 public class Main public static void main String ar
  • 正在更改的线程参数

    当启动多个线程时 id我正在解析的参数有时是错误的 这是我的启动 for int i 0 i lt threadCount i Thread thread new Thread gt WorkerThread i thread Start
  • VB6 的线程模型是什么?

    我正在将一个古老的 VB6 程序移植到 C Net 我不太了解VB6 我问这个是为了更好地理解它 旧的VB6程序有一个程序执行的主过程 但是它also有许多用于套接字事件或计时器事件的事件处理程序 以及这些经常操纵的共享资源 例如 公共全局
  • 在多线程程序中调用fftw

    我想在线程中使用 fftw3 但代码粘贴在http codepad org lIjdGF5z http codepad org lIjdGF5z导致 双重释放或损坏 错误 如何在线程中正确调用 fftw3 例程 谢谢 您可以通过命令 g t
  • 为什么自动装配在线程中不起作用?

    我在Spring 3 0中做了一个maven项目 我做了一些DAO 服务和控制器 在我的一个控制器中我调用了一个服务 在其中启动了一个线程 问题是在线程中我声明了一个 服务 变量 应该使用 Autowired 注释进行初始化 但它不起作用
  • Pthread Mutex:pthread_mutex_unlock() 消耗大量时间

    我用pthread编写了一个多线程程序 使用生产者 消费者模型 当我使用 Intel VTune profiler 来分析我的程序时 我发现生产者和消费者在 pthread mutex unlock 上花费了大量时间 我不明白为什么会这样

随机推荐

  • 如何将 Hive 并发映射器增加到 4 个以上?

    Summary 当我在 hive 中从表查询运行简单的 select count 时 大型集群中只有两个节点用于映射 我想使用整个集群 Details 我正在使用一个运行 hdfs 和 Hive 1 2 1 IBM 12 的大型集群 数十个
  • 片段重新加载后无法修改地图片段

    我有一个activity with 抽屉式导航 and 主页片段 主页片段包含两个嵌套片段 子片段 支持MapFragment and 动作片段 我声明 GoogleMap 对象sMap作为静态主页片段 因此可以被嵌套片段访问和修改动作片段
  • 如何在R闪亮中使用plotly

    我正在尝试为使用闪亮生成的输出添加图表 我收到图形生成错误 有人可以看一下并提供帮助吗 条形图参数是根据计算生成的基于计算的输出 server output graph lt renderPlotly plotly x c as numer
  • 强制 headless chromium/chrome 使用实际的 GPU 而不是 Google SwiftShader

    我正在尝试使用无头铬 使用 puppeteer 将 html 打印为 pdf一切工作正常 除非 html 包含大的 png 图像 超过 10 000x10 000px 渲染页面的整个过程需要非常长的时间 最多半小时 但如果使用非无头模式 只
  • 获取格式错误的访问令牌“t ​ype”:“OAuthException”,“code”:190

    我正在编写一个 Android 应用程序来获取 Facebook 用户相册和照片并显示在我的 Android 应用程序中 我创建了一个Facebook 应用程序 APP ID 281846961912565 在创建 Facebook 实例时
  • 将证据权重 (WoE) 替换为相应的值

    我有一个名为x其最小值为零 最大值为 200 万 所以我将值切成像这样的代码 bins 0 1 10000 20000 50000 60000 70000 100000 2000000 df input X bins pd cut df i
  • Python:带约束的多元非线性求解器

    给定一个函数f x 需要一个输入向量x并返回相同长度的向量 如何找到函数设置约束的根x 例如 每个组件的范围x 令我惊讶的是 我找不到很多关于此的有用信息 在 scipy 列表中优化和求根算法 https docs scipy org do
  • 检查字符串是否可能是名称的缩写

    我正在尝试开发一个 python 算法来检查一个字符串是否可以是另一个单词的缩写 例如 fck是一个匹配项fc kopenhavn因为它匹配单词的第一个字符 fhk不会匹配 fco不应该匹配fc kopenhavn因为没有人会把 FC Ko
  • 组合点击和触摸启动事件不起作用

    我有一个网站 我正在尝试使其在移动设备上也能正常运行 但是 当我分别组合 PC 和平板电脑的单击和 touchstart 事件时 两者都不起作用 单击事件附加到的元素不会触发 谁能解释我应该如何解决这个问题 这是一个元素不起作用的示例 笔具
  • 以编程方式为存储库启用 Github Pages

    有没有办法通过api启用Github页面 不请求页面构建 我的意思是最初启用该功能并指向分支 您只需将内容推送到远程 git 存储库即可 你必须区分用户页面 用户名 github io 和项目页面 用户名 github io 项目名 用户页
  • 如何用手指在WP7中绘制形状?

    如何用手指在WP7中绘制形状 我正在尝试实现一个简单的绘画应用程序 但我不确定如何进行绘图 有两个示例供您使用 您可以从以下链接下载 示例项目1 http windowsphonegeek com tips drawing in wp7 2
  • 准备 iPhone 的调试器支持

    我无法在 iPhone 上安装该应用程序 我被这条消息困住了 准备 iPhone 的调试器支持 在这里尝试了所有答案 https stackoverflow com questions 46316373 xcode9 iphone is b
  • 连接到主机 localhost 端口 22:连接被拒绝

    在我的本地计算机上安装 hadoop 时 出现以下错误 ssh vvv localhost OpenSSH 5 5p1 OpenSSL 1 0 0e fips 6 Sep 2011 debug1 Reading configuration
  • 如何清除分享链接缓存?

    例如 我尝试分享一个链接http apps facebook com appname http apps facebook com appname 在我的个人资料页面上的 更新状态 下 我修改了应用程序的内容后 它仍然显示缓存 我尝试使用h
  • ((指针)(P)+1)^什么时候可以起作用?

    我正在研究delphiXE2 我正在研究PInteger 如果我在我的delphi代码中这样做 var P PInteger testInt Integer Scores array 0 4 of Integer 33 44 56 78 7
  • 使用 SSE2 优化 RGB565 到 RGB888 的转换

    我正在尝试使用 SSE2 和基本公式来优化从 565 到 888 的像素深度转换 col8 col5 lt lt 3 col5 gt gt 2 col8 col6 lt lt 2 col6 gt gt 4 我采用两个 2x565 128 位
  • 实现 gensim.LdaMallet 时出错

    我按照此链接上的说明进行操作 http radimrehurek com 2014 03 tutorial on mallet in python http radimrehurek com 2014 03 tutorial on mall
  • OpenCV 中二值图像的 width 和 widthStep 不同

    我使用 cvLoadImage 在 OpenCV 中加载二进制图像 如下所示 IplImage myImg cvLoadImage
  • Windows 上的 Xvfb

    我正在使用 pyvirtualdisplay 使用无头 Firefox 浏览器运行测试 这是我正在使用的代码 from selenium import webdriver from selenium webdriver support ui
  • VB6 的线程模型是什么?

    我正在将一个古老的 VB6 程序移植到 C Net 我不太了解VB6 我问这个是为了更好地理解它 旧的VB6程序有一个程序执行的主过程 但是它also有许多用于套接字事件或计时器事件的事件处理程序 以及这些经常操纵的共享资源 例如 公共全局