同步 VB6 显然是异步的!碰撞

Sim*_*ods 5 vb6 thread-safety

我们有一个旧的 VB6 应用程序,它不时启动,挂起。我们认为这可能与转向 Citrix 有关,但现在可以在 Win10 上的胖客户端上复制该行为。我们认为我们之前在早期的 Windows 版本上没有看到过这种情况,但仍在检查日志以确认这一点。

我们在跳入文本框然后跳出时会遇到这种行为。当我们通过它时,我们正在做一个简单的 ado 调用来查找/验证文本框中的一些数据。作为正确运行程序的一部分,我们正在记录

“Opening Dataset: SELECT ... FROM ... ”
“Opened Dataset”
Run Code Online (Sandbox Code Playgroud)

在这 2 个日志语句之间是简单的 ado 数据检索代码,我们以前没有遇到过这些问题。它在一个 ActiveX dll 中并且同步运行。最重要的是,在这 2 个日志语句之间,没有DoEvents或 api 调用会产生控制权。就我们所见,它应该是一个纯粹的同步操作。

当系统崩溃时,偶尔发生,我们可以看到其他日志语句出现在这 2 个之间,它们可以是资源状态(例如,多少内存,gdi/用户对象 - 通常会因为计时器在主窗体中触发而找到) ) 或焦点类型事件——它们不是定时器驱动的——至少在我们的代码库中是这样。

“Opening Dataset: SELECT ... FROM ... ”
“Resource Status: ...”
“Opened Dataset”```
Run Code Online (Sandbox Code Playgroud)

或者

“Opening Dataset: SELECT ... FROM ... ”
“TextItem.OnLostFocus Item1 ...”
“TextItem.Validate ...”
“TextItem.OnGotFocus Item2 ...
“Opened Dataset”
Run Code Online (Sandbox Code Playgroud)

所以我最初的问题是,在什么情况下,应该是同步的操作会被中断并显示为异步操作。

例如,我们没有这样做,我可以想象编写一些不安全的代码,通过使用多媒体计时器(在另一个线程上)并向我们的一个模块上的函数的地址提供 AddressOf 参数,该计时器启动执行我们的代码,与正确的控制流分开。除了类似的东西,我只是看不出同步 vb6 代码是如何以这种方式中断的。

如果您有任何想法、建议或意见,我将不胜感激。如果这太模糊了,我真的很抱歉。这可能反映了我是如何努力解决这个问题的。

Sim*_*ods 1

只是说,我们将此问题追溯到 Windows 10 以及我们正在使用的旧(不再支持)套接字组件。看起来它“在错误的时间”泵送消息队列,因此我们看到 UI 事件出现在同步进程的中间。我们在早期的 Windows 版本中没有看到这种行为。

我不知道Win10可能发生了什么变化而导致这种情况,但我们显然需要升级。