【发布时间】: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