我在初始化线程中打开 Matlab 引擎,执行以下操作:
bool MY_MATLAB_ENGINE_o::Open()
{
// Handle the case where engine is already open
if( MatlabEngine )
{
return true;
}
else if( !( MatlabEngine = engOpen( 0 ) ) )
{
return false;
}
IsEngineOpen.SetValue( true );
return true;
}
函数engOpen()
打开一个到 Matlab 的 COM 通道。一旦引擎打开,线程就会进入等待事件模式。
然后,在另一个线程中,我这样做:
bool MY_MATLAB_ENGINE_o::ChangeDirectory( QString strPath )
{
QString strPathToScript = "cd('" + strPath + "');";
QByteArray ba = strPathToScript.toLatin1();
const char* cPathToScript = ba.data();
if( MatlabEngine )
{
engEvalString( MatlabEngine, cPathToScript );
return true;
}
return false;
}
我得到一个CoInitialize has not been called
第一次机会异常engEvalString( MatlabEngine, cPathToScript );
,似乎告诉我 Matlab COM 服务器不可用(但 Matlab 引擎仍在运行)。
当我把所有东西都放在同一个线程中时,它工作得很好,但这不是我想到的那种设计。
我发现 Matlab 引擎文档缺少有关引擎+COM 的信息。知道如何在单独的线程中进行引擎初始化和函数调用吗?
谢谢 !
按照 RobH 的回答进行编辑
我将此方法添加到我的课程中(在第二个线程中实例化):
bool MY_MATLAB_FUNCTION_CALL_o::PostThreadCreationHook()
{
HRESULT hr;
hr = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hr))
{
return false;
}
return true;
}
现在,当我打电话时,engEvalString( MatlabEngine, cPathToScript );
我得到The application called an interface that was marshalled for a different thread
了第一次机会例外 :) 今天早上我玩得很开心!:)
那么,CoMarshalInterface()
?