从C++启动matlab脚本并等待结果
Launching matlab script from C++ and wait for result
在StackOverflow上发表了几篇文章之后,我将通过运行来启动一个matlab脚本
matlab.exe -nodisplay -nosplash -nodesktop -r "run('script.m'); exit;"
实际上,由于这个脚本需要参数,我还将它们设置为全局变量。它运行良好。但是,我多次运行这个脚本,传递不同的参数,并且我希望在启动下一个实例之前完成脚本的一个实例。
所以,在我的C++代码中,我正在做:
SHELLEXECUTEINFO ShExecInfo = { 0 };
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = _T("matlab.exe");
ShExecInfo.lpParameters = _T("-nodisplay -nosplash -nodesktop -r "file1='tmp0.png'; file2='tmp1.png'; outfile='tmpout.flo'; run('runflow.m'); exit; "");
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOWMINNOACTIVE;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
这实际上并不需要等待脚本完成,我最终得到了数百个同时存在的matlab实例。为了避免这种情况,我只是做了一个小黑客:从matlab中删除文件tmp0.png,然后等待这个文件被删除:
SHELLEXECUTEINFO ShExecInfo = { 0 };
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = _T("matlab.exe");
ShExecInfo.lpParameters = _T("-nodisplay -nosplash -nodesktop -r "file1='tmp0.png'; file2='tmp1.png'; outfile='tmpout.flo'; run('runflow.m'); delete('tmp0.png'); exit; "");
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOWMINNOACTIVE;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
while (file_exists("tmp0.png")) ;
其中:
bool file_exists(const char* filename) {
std::ifstream ifile(filename);
return ifile.good();
}
但这有时有效,有时无效。特别是,它经常陷入一个无限循环。。。。直到我手动转到windows资源管理器,右键单击文件"tmp0.png"并单击"属性",这时,它意识到文件可能已经被删除,并最终参与下一次迭代。。。
[编辑]实际上,我意识到/每次/我点击Properties,它都会启动一个新的Matlab实例,无论是否已经有实例在运行。。。
1) 为什么会发生这种情况
2) 我该如何规避这一点(我并不是特别寻找优雅的解决方案,只是一些行之有效的解决方案)
3) 我还想同时推出一些这样的例子。。。
谢谢!
在紧密循环中打开一个文件可能不会给操作系统考虑删除它的机会;考虑在操作系统执行由Matlab启动的删除调用时是否拥有该文件。
在循环中添加睡眠或等待(至少100ms,越多越好)应该会给操作系统删除文件的时间。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 如何让LLDB在成功时退出,在失败时等待
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- 执行并行任务,无需等待C++结果
- 从C++启动matlab脚本并等待结果
- 如何从c++应用程序启动java应用程序,传递参数并等待java应用程序的结果