可以在另一个计时器的回调期间触发定时器吗?

时间:2014-02-25 22:53:26

标签: matlab timer

我有两个同时运行的计时器。第一个计时器每1秒触发一次,运行时间为0.2秒。第二个计时器每20分钟触发一次,需要5分钟才能运行。我希望第一个计时器在第二个计时器执行其回调的5分钟内继续触发。实际上,在第二个计时器的回调期间,第一个计时器不会触发。是否可以配置定时器以执行我想要的方式?

1 个答案:

答案 0 :(得分:1)

有一种解决方法,具体取决于计时器回调的工作结构。如果长计时器回调正在运行长循环或对不同函数的调用序列,则可以插入drawnow()pause(0.01)调用以使其产生Matlab的事件调度队列,该队列将处理挂起的句柄图形和计时器事件,包括你的其他计时器触发器。

这有点像老派合作多任务处理,其中每个线程必须明确地将控制权交给其他线程,而不是被系统的调度程序抢占。 Matlab是关于M代码执行的单线程。当Matlab函数运行时,将引发的事件放在事件队列中并等待函数完成并返回到命令提示符,或drawnow()pause()uiwait()或者类似的功能被称为。这就是你如何保持Matlab GUI响应,并在他们的Handle Graphics的东西下记录。但是Matlab计时器对象使用相同的事件队列进行回调。 (至少在几个版本之前;这只是半文档化的,可能会改变。)因此,您可以使用相同的功能来管理他们的活力。您可能还需要在计时器上调整BusyMode

这是一种破解,但只要你不需要精确的计时,它就应该为你提供基本的功能,并且不需要回调的代码来实际并行运行。 (无论哪个计时器回调产生,都会等待另一个回复完成,然后继续自己的工作。)

如果长时间回调确实阻止了长回调,你无法坚持drawnow来电,那么基本的Matlab运气不好,需要使用评论者建议的其中一个解决方法