DirectShowグラフを既存のアプリケーションに統合する際に奇妙な問題が発生しています。最初にカバーするDirectShow - 新しいスレッドを作成できません
カップルの事:
- グラフの目的は、公開のDirectShowインターフェースを持っているフレームグラバーからの生の映像をもたらすことです。グラフはVMR9を介して表示するためにビデオを右に持ち、生フレームをISampleGrabber(DirectShowの例)を通していくつかのアルゴリズムに公開します。
- グラフは個々のプロジェクトで構築され、正常に実行されています。ビデオはうまく表示され、すべてが幸せです。
これを既存のコードに統合する際に問題が発生します。アプリケーションの初期化から、私はまずグラフを作成し、ウィンドウレスモードでVMR9を実行します。後で初期化すると、_beginthreadex経由で2つのワーカースレッドが作成されます。 _beginthreadexへの呼び出しは、グラフが作成されて実行されているときにのみ(そして、メモリ不足の)戻りコード12で失敗します。
ここで明らかなのは、メモリが不足しているか、他のリソースがあることです。しかし、スレッドが開始しようとしている時点で、私は〜420MBの2GBシステムメモリを使用しています。スレッドスタックサイズは明示的に1MBに設定されています。だから私は私が言うことができる限り、記憶から外れていない。さらに、実行中のアプリケーションには合計15のスレッドがありますので、私はばかげた量を作りません。
誰もがDirectShowで同様の問題を経験しましたか?私はすべての入力を探していますが、私たちはかなりの時間この問題をデバッグしようとしており、成功していません。
ほとんどのDirectShowグラフでは、コードが長いので、必要なコードを投稿します。要求されたよう
編集
。 DirectShowコードのどの部分がスレッドの起動に失敗するのかはわかりません。しかし、私が構築するだけで、グラフを実行しないと、スレッドは正常に機能します。だから私は失敗が実行呼び出し後に発生すると思います。次のようにグラフを実行するための私のコードは次のとおりです。SetVMRSize機能は、単にその親ウィンドウにVMRのサイズを変更
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;
:注目すべき
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