我有两个定时器同时运行。第一个定时器每1秒触发一次,需要0.2秒才能运行。第二个定时器每20分钟触发一次,需要5分钟才能运行。我希望在第二个定时器执行回调的5分钟内,第一个定时器继续触发。实际上,在第二个定时器的回调期间,第一个定时器不会触发。是否可以配置定时器以按照我想要的方式执行?
我有两个定时器同时运行。第一个定时器每1秒触发一次,需要0.2秒才能运行。第二个定时器每20分钟触发一次,需要5分钟才能运行。我希望在第二个定时器执行回调的5分钟内,第一个定时器继续触发。实际上,在第二个定时器的回调期间,第一个定时器不会触发。是否可以配置定时器以按照我想要的方式执行?
如果你的计时器回调工作结构化,那么有一种解决方法。如果长计时器回调正在运行一个长循环或不同函数的序列调用,你可以插入drawnow()
或 pause(0.01)
调用,使其让出控制权给Matlab的事件分派队列,该队列将处理挂起的句柄图形和计时器事件,包括其他计时器的触发。
这有点像老式的协作式多任务处理,每个线程都必须显式地将控制权让给其他线程,而不是被系统的调度程序抢占。Matlab在M代码执行方面是单线程的。当Matlab函数正在运行时,引发的事件被放置在事件队列中,并等待函数完成并返回到命令提示符,或者调用drawnow()
、pause()
、uiwait()
或类似的函数。这就是如何保持Matlab GUI的响应性,并在他们的Handle Graphics文档下进行了记录。但是,Matlab计时器对象使用相同的事件队列来处理它们的回调。(至少在几个版本之前是这样的;这只是半文档化的,可能会改变。)因此,您可以使用相同的函数来管理它们的活力。您还可能需要调整计时器的BusyMode
。