在 Windows 10“Creators Update”64 位上使用 RAD Studio (Delphi) v10.2.1(东京版本 1)进行开发,但 32 位开发。
该应用程序是具有多个后台线程的 VCL,每个后台线程都使用 Indy TidHTTP 来获取网络资源。主线程和后台线程之间的同步是使用消息队列(PostThreadMessage 调用)实现的。这很复杂,在这里提供直接代码会很困难和混乱,所以我从口头描述开始。
应该发生什么:打开一个包含外部资源链接的文件,这会生成 HTTP 请求并将它们交给后台处理,然后等待应用程序消息队列中的传入消息说资源已下载。应用程序消息在分配给 TApplication.OnMessage 的事件代码中匹配(我怀疑这是我的问题所在)。
有用。大多数时候一切都很顺利。但是如果我打开一个 TSaveDialog——即使我取消了对话框而不是实际做任何事情——那么消息就会从应用程序消息队列中丢失。
通过编写日志消息的过程(无法直接调试,因为这会打乱导致问题所需的时间),我发现后台线程确实在发布消息(并从 PostThreadMessage 获得积极响应),但他们永远不会出现在我的 TApplication.OnMessage 事件代码上。
我已经看到各种库中的一些鬼鬼祟祟的代码会设置自己的 PeekMessage/TranslateMessage/DispatchMessage 循环,但并非所有人都记得检查是否有 TApplication.OnMessage 事件。但是我刚刚搜索了 VCL 代码和我正在使用的十几个第三方库,并没有发现任何在这种情况下会受到影响的实例(据我所知)。
注意:我正在使用 madExcept、Indy、FastReport、AddictSpell、SynEdit、VclStyleUtils(以及其他一些鲜为人知的库)
注 2:我想知道它是否与 Delphi 10.2.1 或 Windows 10 Creator 的更新有关,因为我还看到了一些其他奇怪的行为(第一个异常或第一个 TOpenDialog 的长时间延迟 - 但仅在某些应用程序上) 10.1 肯定不会发生(我没有使用 10.2.0)。...但这可能(可能是)不同的东西。
所以我的问题是:我能做些什么呢?
关于如何查找/验证是否有其他代码窃取应用程序消息的任何建议?除了 PeekMessage 之外,我还应该搜索什么?
是否有另一种方法来拦截可能让我避免问题的应用程序消息队列消息?
如果没有更好的选择出现,我可能不得不放弃使用应用程序线程消息并实现我自己的消息传递/同步系统,我宁愿在其他时间都很好地工作后不这样做。