【问题标题】:ActiveX in Delphi blocking VCL threadDelphi中的ActiveX阻塞VCL线程
【发布时间】:2011-01-18 11:21:57
【问题描述】:

遇到了一个奇怪的问题:

我正在使用 delphi 6.0 并尝试集成第三方 activex 控件,该控件连接到服务器、流式传输和呈现视频(此控件不可见)。

控件的帧速率设置为 1 - 30,如果我将其设置为 1 之类的小值,VCL 线程似乎每秒阻塞一秒钟。

换句话说,当视频渲染在这个 ActiveX 控件中完成时,它会休眠一段时间,直到它需要渲染下一帧,但这是我的猜测。

查看注册表,我看到这个控件是单元线程,所以我认为这必须发生的方式是我在 VCL 线程上创建了控件,因此控件内的渲染线程被编组以在 VCL 上运行线程(实际上对控件内部的线程进行编组没有多大意义?)以及由于某些睡眠逻辑,它会导致 VCL 线程阻塞。

基于此,我想如果我创建了一个专用线程来创建此控件(带有隐藏窗口 + 消息泵),则睡眠将在此 ActiveXCreatorThread 而不是 VCL 上发生。 activex 控件是使用 CreateParented(Fowner) 创建的。

不用说这不起作用,VCL 线程继续以同样的方式阻塞,我很困惑。你认为是什么导致了最初的行为?为什么我的 hack 不起作用?

谢谢!

【问题讨论】:

  • 有一些额外的想法,但无法追踪 VCL 库中的代码:在第二种情况下,当我在不同的线程上创建 activex 时,它甚至能够执行任何VCL线程上的代码?我怀疑该机制是一些编组,其中涉及向可能是 activex 控件的父句柄的句柄发送消息?因此,在 vcl 中创建的父级会导致在 vcl 上发生消息处理,从而导致阻塞。谁能确认一些这样的机制?

标签: delphi activex multithreading vcl


【解决方案1】:

我的猜测是因为这是一个带有用户界面的控件,它总是在主 UI 线程中执行。不确定 ActiveX 是如何实现的,但有理由认为它需要以这种方式发生,因为 UI 需要由一个线程更新。

不确定这有多大帮助。我能想到的唯一解决方法是在单独的 exe 中运行控件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2016-01-27
    • 1970-01-01
    相关资源
    最近更新 更多