【发布时间】:2016-02-16 16:24:56
【问题描述】:
为了使用线程中的 COM 对象,我将 CoInitialize(NULL) 插入到线程 Execute 函数中,并将 CoUninitialize() 插入到 Terminate 函数中。
一切正常,除非用户通过从调用表单调用 Terminate 函数来中止线程。
一个表单调用的 Terminate 函数似乎被视为另一个线程(错误消息:'应用程序调用了一个为不同线程编组的接口')。
另一方面,我无法将代码放入特定函数中以使用 Synchronize 进行调用。这样程序就会一直静止,直到被调用函数的COM进程结束。
我知道存在重新寻址 COM 编组的函数。但不知道具体要做什么。我也没有在 C++ 中找到示例。
在寻求帮助之前,我尝试了各种方法来解决这个问题。不幸的是我在这里。
这是我的代码:
class TThreadCamera : public TThread
{
private:
Variant Camera;
protected:
void __fastcall Execute();
public:
void __fastcall Terminate(TObject *Sender);
public:
__fastcall TThreadCamera();
};
-
__fastcall TThreadCamera::TThreadCamera()
: TThread(false)
{
}
//---------------------------------------------------------------------------
void __fastcall TThreadCamera::Execute()
{
FreeOnTerminate = true;
OnTerminate = &Terminate;
CoInitialize(NULL);
Camera = Variant::CreateObject("ASCOM.Simulator.Camera");
Camera.OlePropertySet("Connected", true);
Camera.OleProcedure("StartExposure", 60, true);
while ((! (bool) Camera.OlePropertyGet("ImageReady")))
Sleep 100;
}
//---------------------------------------------------------------------------
void __fastcall TThreadCamera::Terminate(TObject *Sender)
{
if (Camera.OlePropertyGet("CameraState") == 2) // Exposure currently in progress
Camera.OleProcedure("AbortExposure");
CoUninitialize();
}
//---------------------------------------------------------------------------
【问题讨论】:
标签: c++ delphi com c++builder vcl