概述
我创建了一个计时器,每0.1秒执行一次。它调用一个函数,该函数读取数据,然后更新对象的属性。当我启动计时器时,MATLAB在命令窗口的底部显示"忙"信号。 MATLAB变得无响应,我无法使用stop()函数暂停计时器。我唯一的办法是使用Ctrl-C。
我确定问题是计时器回调函数的处理时间长于调用周期,并且我认为没有其他MATLAB代码会挤入堆栈/队列中。这使我有点担心依赖计时器。我的目标是连续从多个设备进行测量,将其存储在一个对象中,并需要MATLAB在这些测量之间进行其他操作。另外,我不能错过任何一项测量。
我正在创建一个响应用户输入并为用户提供实时信息的应用程序,因此我选择了一个快速的时期,认为它将产生快速的用户体验。由于我致力于使用MATLAB,因此我想不出比使用计时器对象更好的方法来实现此功能。所以第一个问题是,计时器对象看起来像是我上面描述的工作的正确工具吗?
其次,如果我要使用计时器对象,是否有人可以分享使用计时器的常见错误或陷阱的经验?或者有人对如何最好地实现计时器对象有任何建议?可以同时使用的计时器对象的数量是否有实际限制?确定计时器对象最佳频率的最佳方法是什么?
谢谢!
我认为0.1秒钟将其推向更高的可靠性,尤其是当您同时运行多个计时器时,尤其是希望用户界面也同时响应时。
MATLAB基本上是单线程的。也有例外,例如较低级别的数学例程以多线程方式调用BLAS,从而大大提高了速度。您也可以用多线程C编写MEX代码,然后从MATLAB调用它。但是,基本上所有代码都在一个真正的线程上运行。
计时器对象在某种程度上也是一个例外。创建计时器对象时,在其下方有一个Java计时器对象,该对象在单独的Java线程上运行。但是,当触发任何回调时,它会回调MATLAB来执行它们,这发生在一个真实的线程上。
如果您不能错过任何一项测量,则需要将计时器的BusyMode属性设置为queue而不是默认的drop,这意味着如果有任何回调花费的时间超过0.1秒,执行,它们将备份-您还必须适应任何用户界面操作。
此外,MATLAB不会(也不能)对计时器回调执行的速度或规则的精度作出任何真正的保证。如果Windows突然决定运行病毒扫描或自行更新等,MATLAB将失去优先权,这将使事情变得混乱。如果您每10秒甚至每1秒触发一次计时器,则很可能会大致准确。但是,如果每毫秒触发一次,就不能指望它是可靠的-为此,您需要一个适当的实时环境。 0.1秒对我来说似乎是临界点,我希望它的可靠性取决于您在这0.1秒内到底在执行什么操作,以及发生了什么(以及您正在运行的计算机)。
要回答您的最后一个问题(最大计时器数,最佳计时器频率等)-没有一般性的答案,只需尝试一下,然后弄清在特定情况下一系列值会发生什么。
如果事实证明它不够可靠,则可以尝试:
以另一种更快的方式(例如在C语言中)进行数据采集,也许是在一个单独的过程中,然后通过MEX从MATLAB调用它,也许带有某种缓冲来使事情变得平稳。
转向其他一些MathWorks产品(例如Simulink,Simulink Coder,某些系统工具箱),这些产品旨在开发适当的实时系统。
希望有帮助!
最后
以上就是老迟到心锁为你收集整理的MATLAB点击运行并计时没反应,MATLAB计时器对象陷阱和不良用法的全部内容,希望文章能够帮你解决MATLAB点击运行并计时没反应,MATLAB计时器对象陷阱和不良用法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复