2010-02-18 61 views
2

运行到一种奇怪的问题:的ActiveX德尔福阻塞线程VCL

我用delphi 6.0和试图整合其连接到服务器,流并再现视频(无可视性第三方ActiveX控件这个控制)。

该控件的帧速率设置为1 - 30,如果我将它设置为像1这样的小值,VCL线程似乎每秒钟都会阻塞一秒。

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

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

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

不用说,这不起作用,VCL线程继续以相同的方式阻塞,我感到困惑。你认为是什么造成了原来的行为?为什么我的黑客无法工作?

谢谢!

+0

有一些额外的想法,但一直没能追查的VCL库中的代码:当我创建了一个不同的线程的activex 在第二种情况下,它甚至能够如何在VCL线程上执行任何代码? 我怀疑这种机制是一些编组,其中涉及发送消息到可能是activex控件的父级的句柄?因此在vcl中创建父对象会导致在导致该对象的vcl上发生消息处理。 任何人都可以确认一些这样的机制? – 2010-02-22 18:59:17

回答

1

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

不知道有多大帮助。我能想到的唯一工作就是在单独的exe中运行控制。