我正在为具有以下说明的 DSLR 相机开发 SDK:
开发 Windows 应用程序的注意事项 创建在 Windows 下运行的应用程序时,每个线程都需要进行 COM 初始化,以便从主线程以外的线程访问相机。要创建用户线程并从该线程访问相机,请确保在线程开始时执行 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) 并在结束时执行 CoUnInitialize()。示例代码如下所示。从另一个线程控制 EdsVolumeRef 或 EdsDirectoryItemRef 对象时也是如此,而不仅仅是 EdsCameraRef。
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 函数来避免跨线程问题。
由于我没有 C# 中用于使用 SDK 的示例源代码,我的问题是,在标有该属性CoInitializeEx
的应用程序中使用它是否有用和/或必要?[STAThread]
我没有遇到过需要让我的应用程序为线程创建一个新单元的情况,这样一些见解将有助于更好地理解线程模型。
更新:在阅读了有关公寓和 COM 的更多信息后,它开始变得有意义。现在我想知道 .NET 托管线程类的默认设置是什么,我们可以在没有 P/Invoke 的情况下以托管方式为每个线程指定一个单元模型吗?