vb6 - 同步 VB6 显然是异步的!碰撞
问题描述
我们有一个旧版 VB6 应用程序,它启动时不时挂起。我们认为这可能与转向 Citrix 有关,但现在可以在 Win10 上的胖客户端上复制该行为。我们认为我们之前在早期的 Windows 版本上没有看到过这种情况,但仍在检查日志以确认这一点。
我们在跳入文本框然后跳出时会遇到这种行为。当我们通过它时,我们正在做一个简单的 ado 调用来查找/验证文本框中的一些数据。作为正确程序运行的一部分,我们正在记录
“Opening Dataset: SELECT ... FROM ... ”
“Opened Dataset”
在这两个日志语句之间是简单的 ado 数据检索代码,我们以前没有遇到过问题。它位于 ActiveX dll 中并且同步运行。最重要的是,在这 2 个日志语句之间,没有DoEvents
或 api 调用会产生控制权。就我们所见,它应该是一个纯粹的同步操作。
当系统崩溃时,偶尔会发生,我们可以看到其他日志语句出现在这两个之间,可以是资源状态(例如,有多少内存,gdi/user 对象 - 通常会发现,因为在主窗体中触发了计时器) 或焦点类型事件 - 不是计时器驱动的 - 至少在我们的代码库中。
“Opening Dataset: SELECT ... FROM ... ”
“Resource Status: ...”
“Opened Dataset”```
或者
“Opening Dataset: SELECT ... FROM ... ”
“TextItem.OnLostFocus Item1 ...”
“TextItem.Validate ...”
“TextItem.OnGotFocus Item2 ...
“Opened Dataset”
所以我最初的问题是,在什么情况下应该是同步操作会被中断并且看起来是异步的。
例如,我们没有这样做,我可以想象编写一些不安全的代码,通过使用多媒体计时器(在另一个线程上)并向我们的一个模块上的函数地址提供 AddressOf 参数,该计时器启动执行我们的代码,与正确的控制流分开。除此之外,我只是看不到同步 vb6 代码如何以这种方式被中断。
我会非常感谢任何想法、建议或建议。如果这太模糊了,我真的很抱歉。它也许反映了我是如何努力解决这个问题的。
解决方案
只是说,我们将此追溯到 Windows 10 以及我们正在使用的旧(不支持)套接字组件。看起来它“在错误的时间”泵送消息队列,因此我们看到 UI 事件出现在同步过程的中间。我们在早期的 Windows 版本上看不到这种行为。
我不知道 Win10 中可能发生了什么变化会导致这种情况,但我们显然需要升级。
推荐阅读
- node.js - 在 Heroku 上 WaitForSelector 超时
- javascript - cloudflare js worker 允许国家列表并阻止其余国家
- mysql - 比较两个不同表中的两列值,并根据 24h 周期计算差异
- excel - 如何检查范围是否包含单词?
- android - 服务器响应失败
- sql - 我的 JOIN 操作中的语法错误是否有快速修复
- google-sheets - 如何将特定值更改为范围
- firebase - 有没有办法在 oncreate 中获取 firebaesevisionimagelabel 数据?
- javascript - 禁用自动放大数据
- c++ - 使用可变参数继承构造函数