0

メディア財団の私の研究では、私は2つの非常に評判の良い情報源から一見矛盾したアドバイスを受けました。 メディア財団とCOM:MSDNからMedia FoundationでCOINIT_APARTMENTTHREADEDまたはCOINIT_MULTITHREADEDを使用しますか?

メディア財団で https://msdn.microsoft.com/en-us/library/windows/desktop/ee892371(v=vs.85).aspx

、非同期処理とコールバックは、作業キューによって処理されます。作業キューには常にマルチスレッドアパートメント(MTA)スレッドがあるため、アプリケーションはMTAスレッドでも実行されると、より簡単な実装になります。そのため、COINIT_MULTITHREADEDフラグを指定してCoInitializeExを呼び出すことをお勧めします。

その後ブックの「Microsoftメディアファンデーションアプリケーション開発 - アントンPolingerでは」から24ページ:

注MFは、COMインターフェイスメソッドから 呼び出すことができることを意味し、フリースレッドシステムであり、任意のスレッド。したがって、CoInitializeEx()を呼び出すときは、COINIT_ APARTMENTTHREADEDパラメータを渡して、アパートメントスレッドのオブジェクトの同時実行性を持つ COMを初期化する必要があります。また、オブジェクトは、 スレッドを同時に実行して内部変数へのアクセスを制御するために、ロックなどのプリミティブ プリミティブを使用する必要があります。

さらに、GitHubにはCOINIT_APARTMENTTHREADEDを使用するMedia Foundationサンプルコードがたくさんあります。

私は、Media Foundationを使用して複数のIPカメラビデオフィードをWindowsにストリーム配信するRTSPクライアントを開発しています。私は私のアプリで複数のスレッドを使用しているので、私は非常にこの問題についての決定的な答えを得ることが重要と考えている。誰かが矛盾を説明し、進める正しい方法を助言してくれますか?

+0

MSDNは、別段の証明がない限り、真実を提供します。それは公式の文書です。 「フリースレッドシステム」は、すべてのスレッド(MSDNと一貫性があります)で使用できるため、「STAを初期化する」必要があるとは言いません。 –

答えて

1

Media Foundationはマーシャリングを使用せず(つまり、直接通信を使用します)、そのオブジェクトは「両方」のアパートメントモデルを使用しており、実行時にフリースレッドマーシャリングが使用されます。

あなたはアパートモデルを自由に選ぶことができます.MTAとSTAの両方がうまくいくでしょう。しかし、Media Foundationによって開始されたワーカースレッドは、常にMTAとして初期化されます(特に、MFの設計では作業キューでのスレッドアライメントの提案はなく、STAを実行する意味がなく、アプリケーションによって初期化される制御スレッドはSTA )。

つまり、制御スレッドをSTAとして初期化することには何も問題ありません。 Media Foundation API呼び出しには影響しません。このドキュメントでは、MTAとして初期化されたすべてのスレッドを誤って混同する可能性がないという理由だけで、MTAの初期化を提案しています。これは、APIが標準COMアパートメントルールを無視してスレッド間でCOMポインタを積極的に渡しているためです。この動作の影響を受けないことを理解している場合は、STAの初期化がうまく機能します。 Media Foundationのサンプルが多数見つかり、アプリケーションがSTAの初期化を行っています。

+0

ありがとうRoman R.! –

関連する問題