【发布时间】:2013-08-09 16:33:40
【问题描述】:
我在我的 Qt 应用程序中使用 DirectShow。
为了创建 Filter Graph 的实例,我使用 QtConcurrent::run(即使用全局应用程序线程池中的可用线程之一)。
这是一个在 QThreadPool 中运行的简化代码示例:
graph_ptr createMovieGraph(const QString & file)
{
::CoInitializeEx(nullptr, COINIT_MULTITHREADED);
auto * dst = graph_ptr(new MovieGraph(path));
::CoUninitialize();
return dst;
}
稍后,我在 UI 线程中删除了我的 graph_ptr 对象。 AFAIK,QApplication UI 线程在 STA 线程模型中工作,但删除工作没有任何崩溃或内存泄漏。对吗?
有时我需要在 UI 线程中暂停或恢复我的 graph_ptr 对象。
// UI Thread
_graph_ptr->pause();
这是 graph_ptr 对象中的“暂停”实现:
_mediaControlInterface->Pause();
// ...
// CComPtr<IMediaControl> _mediaControlInterface;
在graph_ptr对象初始化时在QThreadPool中查询了IMediaControl接口。
事实证明,我使用 UI 线程 (STA) 中的对象,而该对象是在 QThreadPool (MTA) 线程中创建的。 一切正常而不会崩溃,但我想我不能在具有不同线程模型的线程之间使用对象?
提前致谢。
【问题讨论】:
标签: qt com directshow