编辑2:问题已解决,请参阅我的答案。
我正在编写一个通过Engine API与 MATLAB 通信的 C++ 程序。C++ 应用程序在 Windows 7 上运行,并与 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 的第二个调用永远不会被 MATLAB 引擎处理。
线程肯定会运行,您可以通过将engEvalString
调用移动到本地函数并将其作为线程启动来检查这一点。
我真的很难过,如果有任何建议,我将不胜感激!
编辑:正如 Shafik 在他的回答中指出的那样,引擎不是线程安全的。我不认为这对我的用例来说应该是一个问题,因为我需要进行的调用相隔约 5 秒,计算需要 2 秒。我等不及这个计算的原因是 C++ 应用程序是一个“中等难度”的实时机器人控制器,它应该以 50Hz 的频率发送命令。如果此速率降至 30Hz 以下,机器人将承担网络问题并关闭连接。