5

次の手順を持つDSLRカメラ用のSDKを使用しています。

Windowsアプリケーション開発時の注意事項 Windowsで動作するアプリケーションを作成する場合、メインスレッド以外のスレッドからカメラにアクセスするため、スレッドごとにCOMの初期化が必要です。ユーザー スレッドを作成し、そのスレッドからカメラにアクセスするには、必ずスレッドの開始時に CoInitializeEx( NULL, COINIT_APARTMENTTHREADED ) を実行し、最後に CoUnInitialize() を実行してください。サンプルコードを以下に示します。これは、EdsCameraRef だけでなく、別のスレッドから EdsVolumeRef または EdsDirectoryItemRef オブジェクトを制御する場合も同じです。

void TakePicture(EdsCameraRef camera)
{
    // Executed by another thread
    HANDLE hThread = (HANDLE)_beginthread(threadProc, 0, camera);
    // Block until finished
    ::WaitForSingleObject( hThread, INFINITE );
}

void threadProc(void* lParam)
{
    EdsCameraRef camera = (EdsCameraRef)lParam;
    CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
    EdsSendCommand(camera, kEdsCameraCommand_TakePicture, 0);
    CoUninitialize();
    _endthread();
}

私のアプリケーションは C# WinForms アプリで、通常はマネージ スレッド クラスと Control.Invoke 関数を使用してクロススレッドの問題を回避しています。

私は SDK を使用するための C# のサンプル ソース コードを持っていないので、私の質問は、属性CoInitializeExでマークされたアプリで使用するのに役立つか、または使用する必要があるかということです。[STAThread]

アプリでスレッド用の新しいアパートメントを作成する必要があるというシナリオに遭遇したことはないので、スレッド モデルをよりよく理解するのに役立つ洞察が得られます。

更新:アパートと COM についてもう少し読んだ後、ある程度の意味を持ち始めています。ここで、.NET マネージ スレッド クラスの既定値が何になるのか疑問に思っています。また、P/Invoke を使用せずに、各スレッドに管理された方法でアパートメント モデルを指定できますか?

4

1 に答える 1