MATLAB中断定时器的算法
22日视图(30天)
显示旧的评论
这就跟你问声好!我需要设置一个时间限制一个算法。我想抛出错误,停止循环在try块3秒后,然后我想处理错误的catch块。MATLAB给我以下诊断:错误而评估TimerFcn计时器“timer-2”。文本消息的错误!不抛出的显示,但错误虽然周期仍在运行。文本消息的错误了!“不显示。你能帮我吗?
t =定时器;
t。StartDelay = 3;
t。TimerFcn = @ (myTimerObj thisEvent)错误(“错误!”);
开始(t)
= 0;
试一试
而(1)
如果= = 1
打破;
结束
结束
停止(t);
删除(t);
抓
停止(t);
删除(t);
disp (“错误是抓住了!”)
结束
0评论
答案(3)
1月
2020年12月18日
编辑:1月
2020年12月18日
计时器运行在自己的线程。定时器回调的执行正确的停止
错误
命令,但不定期处理其他的Matlab函数。
哪些功能你想中断?如果是如一首颂歌集成器,您可以检查的国旗事件函数的值:
(价值、isterminal方向)= myEventsFcn (t, y)
位置= y (1);%的价值,我们希望为零
isterminal = 0;%停止集成
方向= 0;
《终结者》= getappdata(大的,“TheTerminator”);
如果《终结者》
isterminal = 1;
结束
现在你可以设置此标志
setappdata (groot TheTerminator)
从你的定时器回调。
很多内置函数允许在处理这样的请求,但有些不会。如一个巨大的线性代数计算不能引发了这种方法。然后再操作可以选择启动第二个实例的Matlab,一定时间后杀了它。3秒限制,这将是低效的,因为从Matlab已经花费的时间。但这将工作了好几分钟。
你用的哪些操作系统?
运行时= java.lang.Runtime.getRuntime ();
过程= runtime.exec (“matlab -nodisplay -nosplash -nodesktop - r”YourFunction;退出”);
暂停(100);%或做你想做的事情
试一试
exitCode = process.exitValue ();
disp (过程已经完成。);
抓我
%仍在运行…
process.destroy ();%,对不起,我放弃了
结束
4评论
布莱恩•哈里斯
2023年4月6日
好的,后续问题。如果我使用parfeval可以从子流程通过输出流
f = parfeval (@ () disp (“嗨”),0)
f.Diary
% ans =
%’嗨
%’
但是,我如何做这个“过程”?挖一点,看起来我们可以输入流(子流程提出…)通过:
in_strm = process.getInputStream ();
运行时= java.lang.Runtime.getRuntime ();
过程= runtime.exec (“matlab -nodesktop -nosplash -nodesktop - r“foo;退出”);
%暂停(30);%或做你想做的事情
in_strm = process.getInputStream ();
% out_strm = process.getOutputStream ();
getMethod_args = javaArray (. lang . class的3);
byteArrayName =“[B”;
getMethod_args (1) = java.lang.Class.forName (byteArrayName);
getMethod_args (2) = java.lang.Integer.TYPE;
getMethod_args (3) = java.lang.Integer.TYPE;
m_read = in_strm.getClass () .getMethod (“读”,getMethod_args);
read_args = java.util.ArrayList ();
% num_available = in_strm.available ();
num_available % buf_size = max (1024);
buf_size = 1024;
buf_ptr = 0;
而process.isAlive ()
read_args。添加(0 (1 buf_size“int8”));
read_args.add (int32 (buf_ptr));
read_args.add (int32 (buf_size));
disp (“这似乎块…”);
n_read = m_read。在voke(in_strm, read_args.toArray());
disp (“…这并不打印后才被杀的过程);
= char (read_args.get (0));
= (:)”;
出= (1:n_read);
disp(出);
buf_ptr = n_read;
流(“活着…% s \ n”datetime)
暂停(1);
结束
试一试
exitCode = process.exitValue ();
disp (过程已经完成。);
抓我
%仍在运行…
process.destroy ();%,对不起,我放弃了
结束
但这“勾选”标志总是0,所以我什么也得不到……我找错对象流吗?
出于完整性的考虑,foo.m:
函数foo ()
为i = 1:10
disp(我);
暂停(1);
结束
disp (“完成”);
结束
布莱恩•哈里斯
2023年4月6日
编辑:布莱恩•哈里斯
2023年4月6日
如果你可以电话parfeval的局限性(需要并行处理工具箱,调用函数产生的任何图形surpressed,…)你可以取消没有产生一个新的matlab实例调用。
localPool = gcp (“nocreate”);
如果isempty (localPool)
% parpool singlton,所以如果它不运行,启动它。
localPool = parpool (“本地”2,“IdleTimeout”、24 * 60);
结束
%得到输出称之为“fetchOutputs (f)”,但这阻塞了主线程,所以
%,而不是你可以montor f。导致killable循环,定时器或侦听器…
f = parfeval (localPool @pause 0,正);
%现在我们就杀死3秒后执行
death_clock =计时器(…
“ExecutionMode”,“singleShot”,…
“StartDelay”,3.0,…
“TimerFcn”@(~ ~)取消(f)…
);
%显示FevalFuture对象
disp (f);
流(“开始死亡时钟:% s \ n”datetime);
death_clock.start ();%启动死亡时钟
%完成监测/终止
而~ strcmp (f.State,“完成”)
流(“等待完成…% s \ n”datetime);
暂停(1);
结束
流(“完了…% s \ n”datetime);
disp (f);