我遇到了一些将DirectShow图形集成到现有应用程序中的奇怪问题。DirectShow - 无法创建新线程
有两件事情首先要涵盖:
- 该图的目的是从具有暴露的DirectShow的接口采集卡带来的原始视频。该图通过VMR9正确显示视频,并通过ISampleGrabber(DirectShow示例)将原始帧暴露给某些算法。
- 该图已经在单个项目中成功构建和运行。视频显示正常,一切都很开心。
现在的问题出现在我将它集成到现有的代码中。从应用程序的初始化开始,我首先创建并启动图形,在无窗口模式下运行VMR9。后来在初始化过程中,我通过_beginthreadex创建了几个工作线程。对_beginthreadex的调用失败,返回代码为12(内存不足),当且仅当图形已经建立并运行时。
现在明显的答案是我内存不足或者其他一些资源。但是,在线程尝试启动的时候,我正在使用〜2GB的2GB系统内存。线程堆栈大小已被明确设置为1MB。所以我不会记忆犹新,据我所知。此外,在运行的应用程序中总共有15个线程,所以我不会创建一个荒谬的数额。
有没有人有过/遇到类似DirectShow的问题?我正在寻找任何输入,我们一直在试图调试这个问题很长一段时间,并且还没有成功。
我会发布您需要的任何代码,与大多数DirectShow图形代码很长一样。
编辑
根据要求。我不确定DirectShow代码的哪一部分会导致线程无法启动。但是,如果我只构建,但不运行该图,则线程可以正常工作。所以我猜测失败发生在运行调用之后。我的代码运行图如下:
if (CurrentState != Stopped)
return WrongState;
HRESULT hr;
printf("Attempting to run graph... ");
Timer->Start();
hr = pMediaControl->Run();
if (FAILED(hr))
{
OAFilterState State;
hr = pMediaControl->GetState(1000, &State);
if ((SUCCEEDED(hr) && State != State_Running) || FAILED(hr))
{
return FailedToStartGraph;
}
}
CurrentState = Streaming;
SetVMRSize();
Timer->Stop();
RunTime->Start();
FrameRate->Reset();
return NoError;
的SetVMRSize功能简单地调整大小的VMR它的父窗口:
void KontronGraph::SetVMRSize()
{
if (CurrentState == Disconnected || VideoMode != ParentWindow)
return;
long lWidth, lHeight;
HRESULT hr = pWindowController->GetNativeVideoSize(&lWidth, &lHeight, NULL, NULL);
if (SUCCEEDED(hr))
{
RECT rcSrc, rcDest;
// Set the source rectangle.
rcSrc.left = 0;
rcSrc.right = lWidth;
rcSrc.top = 0;
rcSrc.bottom = lHeight;
// Get the window client area.
GetClientRect(MyHwnd, &rcDest);
// Set the destination rectangle.
rcDest.right = rcDest.right - rcDest.left;
rcDest.bottom = rcDest.bottom - rcDest.top;
rcDest.left = 0;
rcDest.top = 0;
// Set the video position.
hr = pWindowController->SetVideoPosition(&rcSrc, &rcDest);
}
}
值得注意的是,pWindowController是IVMRWindowlessControl9
和pMediaControl是IMediaControl
编辑2
使用CreateTh阅读而不是__beginthreadex。未能启动线程后,GetLastError()返回:
8:没有足够的存储可用于 处理此命令。
的代码来创建线程的样子:
HANDLE worker_thread = CreateThread(0,
Thread_Stack_Size, worker_thread_op, thread_param, 0, 0);
有的为CreateThread的参数:
Thread_Stack_Size = 1024 * 1024;
typedef DWORD (WINAPI *worker_thread_op_type)(LPVOID params);
是否有可能在视频RAM上运行? – StefanE