MATLAB中断定时器的算法

22日视图(30天)
亚历山大Voznesensky
亚历山大Voznesensky 2020年12月14日
这就跟你问声好!我需要设置一个时间限制一个算法。我想抛出错误,停止循环在try块3秒后,然后我想处理错误的catch块。MATLAB给我以下诊断:错误而评估TimerFcn计时器“timer-2”。文本消息的错误!不抛出的显示,但错误虽然周期仍在运行。文本消息的错误了!“不显示。你能帮我吗?
t =定时器;
t。StartDelay = 3;
t。TimerFcn = @ (myTimerObj thisEvent)错误(“错误!”);
开始(t)
= 0;
试一试
(1)
如果= = 1
打破;
结束
结束
停止(t);
删除(t);
停止(t);
删除(t);
disp (“错误是抓住了!”)
结束

答案(3)

1月
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 (“完成”);
结束

登录置评。


约瑟夫威尔逊
约瑟夫威尔逊 2020年12月14日
编辑:沃尔特·罗伯森 2023年4月6日
清晰;clc
timerval =抽搐;
1
endval = toc (timerval);
如果endval > = 3
打破
结束
结束
% tic和toc是建立在matlab函数来计算时间。这利用了他们数秒的时间长度的循环
5个评论
亚历山大Voznesensky
亚历山大Voznesensky 2020年12月16日
是的,他们是建立在matlab函数…

登录置评。


布莱恩•哈里斯
布莱恩•哈里斯 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);
4评论
布莱恩•哈里斯
布莱恩•哈里斯 2023年4月6日
编辑:布莱恩•哈里斯 2023年4月6日
谢谢沃尔特。我得给那一枪。遗憾的是我现在的项目是坚持R2020a (backgroundPool R2021b介绍);会在下一个项目!注意,使用parpool(“线程”)应该是相似的,所以我给它一试;虽然有 一些额外的限制 在当地。

登录置评。

类别

找到更多的在启动和关闭帮助中心文件交换

下载188bet金宝搏

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!