Aplicativo C ++ multithreaded usando o Matlab Engine
Eu abro o mecanismo Matlab em um thread de inicialização, fazendo:
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;
}
FunçãoengOpen()
abre um canal COM para o Matlab. Depois que o mecanismo é aberto, o segmento cai no modo de evento de espera.
Então, em outro tópico, eu faço isso:
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;
}
Eu recebo umCoInitialize has not been called
exceção de primeira chance emengEvalString( MatlabEngine, cPathToScript );
o que parece me dizer que o servidor COM do Matlab não está disponível (mas o mecanismo do Matlab ainda está ativo e em execução).
Quando eu coloco tudo no mesmo thread, ele funciona bem, mas não é esse o tipo de design que eu tinha em mente.
Acho que a documentação do mecanismo do Matlab não possui informações sobre o mecanismo + COM. Alguma idéia de como ter a inicialização do mecanismo e chamadas de função em segmentos separados?
Obrigado !
EDIT seguindo a resposta de RobH
Eu adicionei este método para minha classe (instanciado no segundo segmento):
bool MY_MATLAB_FUNCTION_CALL_o::PostThreadCreationHook()
{
HRESULT hr;
hr = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hr))
{
return false;
}
return true;
}
E agora quando eu chamoengEvalString( MatlabEngine, cPathToScript );
eu receboThe application called an interface that was marshalled for a different thread
primeira chance exceção :) Eu me divirto muito esta manhã! :)
Assim,CoMarshalInterface()
?