一个计时器的回调函数期间能否触发另一个计时器?

3

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


1
据我所知,您遇到了Matlab的限制。可能的解决方法是使用mex函数或在后台运行Java线程。 - Daniel
3
根据回调函数的性质,如果您有并行计算工具箱,可以使用它来实现目标。如果不可能,那么您可以同时运行两个Matlab实例。请参见此处的解释:http://www.mathworks.com/matlabcentral/answers/98271 - jerad
1个回答

1

如果你的计时器回调工作结构化,那么有一种解决方法。如果长计时器回调正在运行一个长循环或不同函数的序列调用,你可以插入drawnow()pause(0.01) 调用,使其让出控制权给Matlab的事件分派队列,该队列将处理挂起的句柄图形和计时器事件,包括其他计时器的触发。

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

这种方法有些取巧,但只要您不需要精确的时间控制,也不需要回调代码实际并行运行,它就可以为您提供基本功能。(无论哪个计时器回调被挂起,都会等待另一个完成其工作后才继续进行自己的工作。) 如果长时间回调真的被阻塞在您无法插入 drawnow 调用的长操作上,那么您将无法使用基本的 Matlab,并需要使用评论者建议的其中一种解决方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接