在 cmd 中运行 Matlab 代码并等待它完成

Posted

技术标签:

【中文标题】在 cmd 中运行 Matlab 代码并等待它完成【英文标题】:run a Matlab code in cmd and wait for it to finish 【发布时间】:2019-08-01 10:25:00 【问题描述】:

我想在我的 c++ 程序中运行一个 matlab 代码并等待 Matlab 的结果,然后继续我的 c++ 代码。问题是程序不等待 matlab 并继续运行。 我应该在我的代码中添加任何内容吗?

实际上我尝试创建进程并使用了 WaitForSingleObject。

int main()

    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );


    system("matlab.exe -nosplash -nodesktop -nodisplay -r run('Main')");

    WaitForSingleObject( pi.hProcess, INFINITE );

    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );

.
.
.

【问题讨论】:

您正在混合运行外部程序的两种不同且不兼容的方式。 std::system 函数是一个标准的 C++ 函数,它会阻塞直到你执行的程序完成。 STARTUPINFOPROCESS_INFORMATION 结构,句柄和WaitForSingleObjectCloseHandle 用于Windows API 功能CreateProcess,这是一个完全不同的运行程序系统。 那么,我该怎么办?我也只使用了 system("matlab.exe -nosplash -nodesktop -nodisplay -r run('Main')");但它不会等待它 如果你运行的程序启动了自己的进程并让它们在主进程退出时在后台运行,那么你如何运行程序并不重要。如果有办法告诉程序不要提前退出,你需要使用它。否则你需要想出另一种方法来做你想做的事。 【参考方案1】:

您可能需要使用该选项

-batch

用 matlab 代替选项

-r

例如。有关详细信息,请参阅此页面:https://www.mathworks.com/help/matlab/ref/matlabwindows.html


另外,std::system 调用是 'standalone' - 但是您应该检查启动的进程的返回。

int ret = std::system("....");
if (ret != 0) 
  std::terminate();//somethings not right...

【讨论】:

非常感谢。现在已经解决了。我用了-等待; system("matlab.exe -wait -nosplash -nodesktop -nodisplay -r run('Main')");

以上是关于在 cmd 中运行 Matlab 代码并等待它完成的主要内容,如果未能解决你的问题,请参考以下文章

详解MATLAB的函数system(),并利用它实现在MATLAB中运行(调用)外部exe程序

matlab 怎样运行m文件?

使用 PowerShell 运行应用程序并等待它完成

有没有办法在我的桌面上运行 .lnk 文件并等待它完成?

执行 AutoIt 并等待完成

如何从 Matlab C API 调用 engClose() 并等待其进程关闭?