【发布时间】:2012-06-01 00:35:01
【问题描述】:
当在 Matlab 中启动外部程序(我们简称为“EX”)时,我可以这样做
[status, result] = system('EX.exe');
在EX返回之前阻塞,或者像这样
[status, result] = system('start EX.exe');
立即返回 Matlab 但无法获取 EX 的返回码。
完成后,如果 EX 的返回码在 Matlab 中仍然可用,那就太好了。这将是调用 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() 之后的代码似乎永远不会被执行,并且计时器回调永远运行......有没有其他方法可以让它工作,或者它真的是系统的返回值还是非阻塞调用?
【问题讨论】:
-
我还不确定如何,但也许您可以使用 MATLAB 中的 Java/.NET 功能来执行异步操作?
标签: matlab