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() ?

questionAnswers(1)

yourAnswerToTheQuestion