timer
调度 MATLAB 命令的执行
说明
使用 timer
调度由 MATLAB® 回调函数组成的任务的一次或多次执行。如果您调度一个计时器多次执行命令,您可以通过调整该计时器的属性,指定各次执行之间的时间间隔以及如何处理排队冲突。
timer
对象使用回调函数执行命令。回调函数在出现某个事件时执行代码,对于 timer
来说就是历时。对于 timer
对象,您可以将回调函数指定为函数句柄或字符向量。如果回调函数是字符向量,MATLAB 将以可执行代码形式对其求值。当计时器启动 (StartFcn
)、执行 (TimerFcn
)、停止 (StopFcn
) 或遇到错误 (ErrorFcn
) 时,计时器对象支持回调函数。有关回调函数的详细信息,请参阅计时器回调函数。
创建对象
属性
回调函数属性
TimerFcn
— 计时器回调函数
字符向量 | 字符串标量 | 函数句柄 | 元胞数组
计时器回调函数,指定为字符向量、字符串标量、函数句柄或元胞数组。您必须定义此属性,才能启动计时器。
如果您使用函数句柄指定此属性,当 MATLAB 执行回调时,它会将
timer
对象和事件结构体传递给回调函数。事件结构体的Type
字段中包含事件的类型,Data
字段中包含事件的时间。如果您使用字符向量或字符串标量指定此属性,则当 MATLAB 执行回调时,它会对字符向量中包含的 MATLAB 代码求值。不建议将回调定义为字符向量。将函数指定为函数句柄的用法可以让 MATLAB 为回调函数提供重要信息。
如果回调函数接受除
timer
对象和事件数据以外的参量,请将此属性指定为包含函数句柄和其他参量的元胞数组。
有关详细信息,请参阅计时器回调函数。
示例: t = timer('TimerFcn',"MyTimerFunction(Input);")
StartFcn
— 计时器启动回调函数
字符向量 | 字符串标量 | 函数句柄 | 元胞数组
计时器启动回调函数,指定为字符向量、字符串标量、函数句柄或元胞数组。
如果您使用函数句柄指定此属性,当 MATLAB 执行回调时,它会将
timer
对象和事件结构体传递给回调函数。事件结构体的Type
字段中包含事件的类型,Data
字段中包含事件的时间。如果您使用字符向量或字符串标量指定此属性,则当 MATLAB 执行回调时,它会对字符向量中包含的 MATLAB 代码求值。不建议将回调定义为字符向量。将函数指定为函数句柄的用法可以让 MATLAB 为回调函数提供重要信息。
如果回调函数接受除
timer
对象和事件数据以外的参量,请将此属性指定为包含函数句柄和其他参量的元胞数组。
有关详细信息,请参阅计时器回调函数。
示例: t = timer('StartFcn',@MyStartFunction(~,~))
StopFcn
— 计时器停止回调函数
字符向量 | 字符串标量 | 函数句柄 | 元胞数组
计时器停止回调函数,指定为字符向量、字符串标量、函数句柄或元胞数组。
计时器会在以下情况下停止:
调用计时器
stop
方法。计时器完成执行
TimerFcn
。换句话说,TasksExecuted
的值达到TasksToExecute
设置的限值。出现错误。首先调用
ErrorFcn
回调,然后调用StopFcn
回调。
您可以使用 StopFcn
定义清理操作,例如删除内存中的计时器对象。
如果您使用函数句柄指定此属性,当 MATLAB 执行回调时,它会将
timer
对象和事件结构体传递给回调函数。事件结构体的Type
字段中包含事件的类型,Data
字段中包含事件的时间。如果您使用字符向量或字符串标量指定此属性,则当 MATLAB 执行回调时,它会对字符向量中包含的 MATLAB 代码求值。不建议将回调定义为字符向量。将函数指定为函数句柄的用法可以让 MATLAB 为回调函数提供重要信息。
如果回调函数接受除
timer
对象和事件数据以外的参量,请将此属性指定为包含函数句柄和其他参量的元胞数组。
有关详细信息,请参阅计时器回调函数。
示例: t = timer('StopFcn',@MyStopFunction(~,~))
ErrorFcn
— 计时器错误回调函数
字符向量 | 字符串标量 | 函数句柄 | 元胞数组
计时器错误回调函数,指定为字符向量、字符串标量、函数句柄或元胞数组。如果出现错误,将会执行此函数,然后调用 StopFcn
。
如果您使用字符向量或字符串标量指定此属性,则当 MATLAB 执行回调时,它会对字符向量中包含的 MATLAB 代码求值。
如果您使用函数句柄指定此属性,当 MATLAB 执行回调时,它会将
timer
对象和事件结构体传递给回调函数。事件结构体的Type
字段中包含事件的类型,Data
字段中包含事件的时间。如果回调函数接受除
timer
对象和事件数据以外的参量,请将此属性指定为包含函数句柄和其他参量的元胞数组。
有关详细信息,请参阅计时器回调函数。
示例: t = timer('ErrorFcn','disp("An error has occurred")')
计时属性
Period
— 各次执行之间的延迟
1 (默认) | 数值标量
各次执行之间的延迟,以秒为单位,指定为大于 0.001 的数字。要使计时器使用 Period
,您必须设置 ExecutionMode
和 TasksToExecute
以排定多个计时器对象回调事件的执行。
示例: t = timer('Period',5)
StartDelay
— 计时器启动和第一次执行之间的延迟
0 (默认) | 数值标量
计时器启动和第一次执行之间的延迟,以秒为单位,指定为大于或等于 0 的数字。如果 Running = 'on'
,则 StartDelay
是只读的。
示例: t = timer('StartDelay',2)
TasksToExecute
— 计时器回调函数执行的次数
数值标量
计时器回调函数执行的次数,指定为大于 0 的数字。使用 TasksToExecute
属性设置执行次数。要使用 TasksToExecute
,您必须设置 ExecutionMode
以排定多个计时器回调事件的执行。根据计时器队列的状态,在计时器运行时更改 TasksToExecute
可能不会立即生效。有关计时器队列的详细信息,请参阅处理计时器队列冲突。
示例: t = timer('TasksToExecute',5)
BusyMode
— 计时器函数回调排队
'drop'
(默认) | 'error'
| 'queue'
计时器函数回调排队,指定为下表中的值之一。使用此属性可以指定在计时器必须在上一次 TimerFcn
执行完毕之前再次执行 TimerFcn
时需采取的操作。当 Running
属性设置为 'on'
时,BusyMode
属性为只读。
仅当 ExecutionMode
属性设置为 FixedRate
时,BusyMode
属性才会影响行为。对于 ExecutionMode
的其他值,执行计时器回调函数的多次尝试之间不能存在重叠,因为各次执行之间的延迟始终是相对于前一次执行的完成而言的。
| 队列为空时的行为 | 队列不为空时的行为 | 注释 |
---|---|---|---|
| 将任务添加到队列中 | 放弃任务 | 可能跳过 |
| 将任务添加到队列中 | 完成任务;引发 | 完成当前正在执行的任务后停止计时器 |
| 将任务添加到队列中 | 等待队列清除,然后使任务进入队列中 | 调整 |
有关详细信息,请参阅处理计时器队列冲突。
示例: t = timer('BusyMode','error')
ExecutionMode
— 计时器函数回调调度
'singleShot'
(默认) | 'fixedRate'
| 'fixedDelay'
| 'fixedSpacing'
计时器函数回调调度,指定为下表中的值之一。当 Running='on'
时,ExecutionMode
为只读。下表概述了执行模式。
执行模式 | 时间 |
---|---|
| 计时器回调函数只执行一次。因此, |
| 在将计时器回调函数添加到 MATLAB 执行队列中后立即启动。 |
| 在计时器回调函数经过一段时滞(因 MATLAB 执行队列中出现延迟)后重新开始执行时启动。 |
| 在计时器回调函数完成执行时启动。 |
'singleShot'
是timer
类的单次执行模式,并且是默认值。'fixedDelay'
、'fixedRate'
和'fixedSpacing'
是三个受支持的多次执行模式。这些模式定义Period
属性的起点。Period
属性指定执行之间的间隔时间(保持不变)。只有执行起点是不同的。
示例: t = timer('ExecutionMode','fixedDelay')
标注属性
Name
— 计时器名称
'timer-i'
(默认) | 字符向量 | 字符串标量
计时器名称,指定为字符向量或字符串标量。
默认值为 'timer-
i
'
,其中 i
是一个数字,指示第 i
个计时器对象创建了此会话。
示例: t = timer('Name','MyTimer')
Tag
— 对象标签
字符向量 | 字符串标量
对象标签,指定为字符向量或字符串标量。
示例: t = timer('Tag','TimerTag')
ObjectVisibility
— 对象可见性
'on'
(默认) | 'off'
对象可见性,指定为 'on'
或 'off'
,您可以利用它来阻止最终用户访问应用程序所创建的计时器对象。timerfind
函数不会返回 ObjectVisibility
属性设置为 'off'
的对象。不可见的对象仍然有效。要检索内存中的所有计时器对象(包括不可见对象)的列表,请使用 timerfindall
函数。
示例: t = timer('ObjectVisibility','off')
UserData
— 用户数据的字段
任何有效的 MATLAB 数据类型
要向对象添加的数据的一般字段。
示例: t = timer('UserData',"This is my first timer!")
只读属性
AveragePeriod
— 各次执行之间的平均时间
数值标量
各次执行之间的平均时间,以秒为单位,指定为数值标量。在计时器执行完两次计时器回调之前,该值一直为 NaN
。
InstantPeriod
— 最后两次执行之间的时间
NaN
(默认) | 数值标量
最后两次执行之间的时间,以秒为单位,指定为数值标量。在计时器执行完两次计时器回调之前,该值一直为 NaN
。
Running
— 主动执行回调函数的指示符
'off'
| 'on'
主动执行回调函数的指示符,指定为 'off'
或 'on'
。
TasksExecuted
— 计时器已执行的次数
数值标量
计时器已执行的次数,指定为数值标量。
Type
— 对象类型
'timer'
(默认)
标识对象类型的字符向量。
对象函数
示例
时滞后显示消息
使用计时器对象在 3 秒的时滞后显示消息。
创建一个 timer
对象。通过设置 TimerFcn
属性来指定要显示的消息。通过将 StartDelay
属性设置为 3,指定 3 秒的时滞。
t = timer;
t.StartDelay = 3;
t.TimerFcn = @(~,~)disp('3 seconds have elapsed');
启动计时器。
start(t)
三秒后,显示消息。
3 seconds have elapsed
多次执行回调函数
计时器启动时显示日期时间,2 秒后计时器停止时再次显示。
通过将 StartFcn
属性设置为回调函数来显示计时器启动时的日期时间。回调函数的前两个参量是 timer
对象和具有 Type
和 Data
字段的事件结构体。同样,通过设置 StopFcn
属性来显示计时器停止时的日期时间。
t = timer; t.StartFcn = @(~,thisEvent)disp([thisEvent.Type ' executed '... datestr(thisEvent.Data.time,'dd-mmm-yyyy HH:MM:SS.FFF')]); t.StopFcn = @(~,thisEvent)disp([thisEvent.Type ' executed '... datestr(thisEvent.Data.time,'dd-mmm-yyyy HH:MM:SS.FFF')]); t.Period = 2; start(t)
StartFcn executed 14-Jan-2020 09:08:50.865 StopFcn executed 14-Jan-2020 09:08:52.869
在执行过程中显示日期时间三次,消息之间暂停两秒。通过设置 TimerFcn
属性来指定要显示的消息。然后,使用 TasksToExecute
和 Period
属性指示显示消息的次数和每条消息之间的延迟。ExecutionMode
指定在调用 TimerFcn
时即启动周期计时器。。
t.TimerFcn = @(~,thisEvent)disp([thisEvent.Type ' executed '... datestr(thisEvent.Data.time,'dd-mmm-yyyy HH:MM:SS.FFF')]); t.TasksToExecute = 3; t.ExecutionMode = 'fixedRate'; start(t)
StartFcn executed 14-Jan-2020 09:08:50.865 TimerFcn executed 14-Jan-2020 09:08:50.865 TimerFcn executed 14-Jan-2020 09:08:52.865 TimerFcn executed 14-Jan-2020 09:08:54.866 StopFcn executed 14-Jan-2020 09:08:54.869
定义自定义回调函数
创建一个计时器对象,以提醒在 8 小时工作期间,每 10 分钟做一次时长 30 秒的人体工学运动休息。
创建一个返回 timer
对象的函数 createErgoTimer
。包括三个局部函数,用于指定计时器启动、执行和停止时的任务。
使用 StartDelay
可以先启动计时器,而不提示您立即休息。将执行模式设置为 'fixedSpacing'
,使完成 TimerFcn
执行花费的时间为 10
分 30
秒 (t.Period
)。在下一个 10
分钟间隔开始之前,您可以留出 30
秒的休息时间。
function t = createErgoTimer() t = timer; t.StartFcn = @ergoTimerStart; t.TimerFcn = @takeBreak; t.StopFcn = @ergoTimerCleanup; % 10 minutes between breaks + 30 second break t.Period = 600+30; % time till first break t.StartDelay = t.Period-30; % Number of breaks during 8-hr period t.TasksToExecute = ceil(8*60^2/t.Period); t.ExecutionMode = 'fixedSpacing'; end
添加一个与计时器启动相关联的局部函数回调。由 StartFcn
执行的任务显示消息,指示人体工学计时器已开始。默认情况下,timer
对象将其自身和事件数据传递给回调函数。该函数会忽略事件数据。
function ergoTimerStart(mTimer,~) disp("Starting Ergonomic Break Timer." + newline +... "For the next 8 hours you will be notified " +... "to take a 30 second break every 10 minutes.") end
添加一个局部回调函数,该函数显示一条提醒您休息 30 秒的消息。
function takeBreak(mTimer,~) disp('Take a 30 second break.') end
添加一个局部回调函数来处理与停止计时器关联的任务。
function ergoTimerCleanup(mTimer,~) disp('Stopping Ergonomic Break Timer.') delete(mTimer) end
删除计时器对象会将其从内存中移除。
在命令行中,调用 createErgoTimer
函数以创建和启动计时器。
t = createErgoTimer; start(t)
Starting Ergonomic Break Timer. For the next 8 hours you will be notified to take a 30 second break every 10 minutes.
每隔 10
分钟,系统会提醒您休息 30
秒。
Take a break.
您可以使计时器在 8
小时内保持运行,或者将其手动停止。StopFcn
回调包括从内存中删除计时器的任务。
stop(t)
Stopping Ergonomic Break Timer.
局限性
timer
对象受到您的硬件、操作系统和软件的限制。应避免对实时应用程序使用timer
对象。如果 MATLAB 正忙于处理另一个任务,计时器回调可能不会执行。不推荐在计时器回调函数中使用
wait
。
提示
要强制执行事件队列中的回调函数,请包含对
drawnow
函数的调用。drawnow
函数会刷新事件队列。
版本历史记录
在 R2006a 之前推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)