編集2:問題は解決しました。私の答えを参照してください。
EngineAPIを介してMATLABと通信するC++プログラムを作成しています。C++アプリケーションはWindows7で実行されており、MATLAB 2012b(32ビット)と対話します。
を使用してMATLABエンジンに時間のかかる呼び出しを行いengEvalString
たいのですが、呼び出しを非同期にする方法がわかりません。コールバックは必要ありません(ただし、可能であればいいでしょう)。
以下は、機能しないものの最小限の例です。
#include <boost/thread.hpp>
extern "C" {
#include <engine.h>
}
int main()
{
Engine* eng = engOpen("");
engEvalString(eng,"x=10");
boost::thread asyncEval(&engEvalString,eng,"y=5");
boost::this_thread::sleep(boost::posix_time::seconds(10));
return 0;
}
このプログラムを実行した後、MATLABエンジンウィンドウに切り替えて、次のことを見つけます。
» x
x =
10
» y
Undefined function or variable 'y'.
したがって、y = 5に設定する必要がある2番目の呼び出しは、MATLABエンジンによって処理されないようです。
スレッドは確実に実行されます。engEvalString
呼び出しをローカル関数に移動し、代わりにスレッドとして起動することで、これを確認できます。
私はここで本当に困惑しています、そしてどんな提案でもありがたいです!
編集: Shafikが彼の答えで指摘したように、エンジンはスレッドセーフではありません。私が行う必要のある呼び出しは2秒かかる計算の場合、約5秒離れているため、これが私のユースケースの問題になるとは思わない。この計算が待ちきれない理由は、C++アプリケーションが「ミディアムハード」のリアルタイムロボットコントローラーであり、50Hzでコマンドを送信する必要があるためです。このレートが30Hzを下回ると、ロボットはネットワークの問題を想定して接続を閉じます。