当从 Matlab 中启动外部程序(为了简洁起见,我们将其称为“EX”)时,我可以这样做
[status, result] = system('EX.exe');
它将阻塞直到 EX 返回,或者像这样
[status, result] = system('start EX.exe');
它立即返回到 Matlab,但无法获取 EX 的返回码。
完成后,如果在 Matlab 中仍然可以使用 EX 的返回代码,那就太好了。这将是调用 Matlab 脚本来注意到 EX 可能遇到的任何问题的最简单方法。另一方面,我希望 Matlab 在 EX 运行时做其他事情,例如显示有关进度的信息。因此,调用必须是非阻塞的。
我尝试通过启动 EX 来解决这个明显的冲突,如上面第一个示例中所述。为了能够在 EX 繁忙时运行一些其他代码(显示进度信息),我将此代码放入一个函数中,并通过使用具有较小 StartDelay 的计时器来调用该函数。
不幸的是,这并没有提供真正的多线程(如果没有并行计算工具箱,Matlab 似乎无法提供这种功能),即如果计时器回调中的代码运行时间超过 EX,则执行会再次阻塞,直到计时器回调返回。更糟糕的是:由于我不知道 EX 将运行多长时间,因此计时器回调必须无休止地运行,直到它停止或传递一些告诉它停止的标志。我尝试使用全局变量,甚至将此标志存储在应用程序数据中,如下所示:
setappdata(0, 'running', 1);
tim = timer(...
'StartDelay', 2, ...
'TimerFcn', 'while getappdata(0, ''running''), fprintf(''timer running ...\n''); pause(1); end' ...
);
fprintf('Starting timer.\n');
start(tim);
fprintf('Calling external program ...\n');
[s,r] = system('EX.exe');
fprintf('External program returned %d.\n', s); % <-- This is never reached.
setappdata(0, 'running', 0);
fprintf('Stopping timer.\n');
stop(tim);
delete(tim);
调用 system() 之后的代码似乎永远不会被执行,并且计时器回调永远运行...有没有其他方法可以让它工作,或者它真的是系统的返回值还是非阻塞调用?