本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

timer 类

创建对象以排定 MATLAB 命令的执行

说明

使用 timer 对象以排定执行一次或多次 MATLAB® 命令。如果您排定计时器多次执行命令,可以定义每次执行之间的时间间隔以及如何处理排队冲突。

timer 对象使用回调函数执行命令。回调函数在某些事件中执行代码。对于 timer 对象,您可以将回调函数指定为函数句柄或字符向量。如果回调函数是字符向量,MATLAB 将以可执行代码形式对其求值。当计时器启动 (StartFcn)、执行 (TimerFcn)、停止 (StopFcn) 或遇到错误 (ErrorFcn) 时,计时器对象支持回调函数。

注意

timer 对象受到您的硬件、操作系统和软件的限制。应避免对实时应用程序使用计时器对象。

构造

t = timer 创建一个空的 timer 对象,以排定 MATLAB 命令的执行。如果启动了计时器,但未定义 TimerFcn,则会出现错误。

t = timer(Name,Value) 使用由一个或多个 Name,Value 对组参数指定的其他选项创建 timer 对象。

输入参数

名称-值对组参数

指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN 所示。

参数名称 Name 对应于一个 timer 属性名称。在构造函数中,属性值是使用 Name,Value 对组参数指定的。

'BusyMode'

字符向量或字符串标量,指示在计时器必须在上一次 TimerFcn 执行完毕之前再次执行 TimerFcn 时需采取的操作。如果 Running='on',则 BusyMode 是只读的。下表概述了忙碌模式。

BusyMode

队列为空时的行为

队列不为空时的行为

注释

'drop'

将任务添加到队列中

放弃任务

可能跳过 TimerFcn 调用

'error'

将任务添加到队列中

完成任务;引发 ErrorFcn 指定的错误;停止计时器

完成执行队列中的任务后停止计时器

'queue'

将任务添加到队列中

等待队列清除,然后使任务进入队列中

调整 Period 属性以管理执行队列中的任务

有关详细信息,请参阅处理计时器队列冲突

默认: 'drop'

'ErrorFcn'

字符向量、字符串标量、函数句柄或元胞数组,用于定义在出现错误时计时器应执行的函数。如果出现错误,将会执行此函数,然后调用 StopFcn

  • 如果您使用字符向量或字符串标量指定此属性,则当 MATLAB 执行回调时,它会对字符向量中包含的 MATLAB 代码求值。

  • 如果您使用函数句柄指定此属性,当 MATLAB 执行回调时,它会将 timer 对象和事件结构体传递给回调函数。事件结构体的 Type 字段中包含事件的类型,Data 字段中包含事件的时间。

  • 如果回调函数接受除 timer 对象和事件数据以外的参数,请将此属性指定为包含函数句柄和其他参数的元胞数组。

有关详细信息,请参阅计时器回调函数

'ExecutionMode'

字符向量或字符串标量,用于定义 timer 对象如何排定计时器事件的字符向量。如果 Running='on',则 ExecutionMode 是只读的。下表概述了执行模式。

执行模式

时间 Period 起点

'singleShot'

在此模式中,计时器回调函数仅执行一次。因此,Period 属性没有任何作用。这是默认的执行模式。

'fixedRate'

在将计时器回调函数添加到 MATLAB 执行队列中后立即启动

'fixedDelay'

在计时器回调函数经过一段时滞(因 MATLAB 执行队列中出现延迟)后重新开始执行时启动

'fixedSpacing'

在计时器回调函数完成执行时启动。

  • 'singleShot'timer 类的单次执行模式,并且是默认值。

  • 'fixedDelay''fixedRate''fixedSpacing' 是三个受支持的多次执行模式。这些模式定义 Period 属性的起点。Period 属性指定执行之间的间隔时间(保持不变)。只有执行起点是不同的。

默认: 'singleShot'

'Name'

表示 timer 名称的字符向量或字符串标量。

默认: 'timer-i',其中 i 是一个数字,指示第 i 个计时器对象创建了此会话。要将 i 重置为 1,请执行 clear classes 命令。

'ObjectVisibility'

可能为 'on''off' 的字符向量或字符串标量,您可以利用它来阻止最终用户访问应用程序所创建的计时器对象。timerfind 函数不会返回 ObjectVisibility 属性设置为 'off' 的对象。不可见的对象仍然有效。要检索内存中的所有计时器对象(包括不可见对象)的列表,请使用 timerfindall 函数。

默认: 'on'

'Period'

大于 0.001 的数字,用于以秒为单位指定 TimerFcn 执行之间的延迟。要使计时器使用 Period,您必须设置 ExecutionModeTasksToExecute 以排定多个计时器对象回调事件的执行。

默认: 1.0

'StartDelay'

大于或等于 0 的数字,用于以秒为单位指定启动计时器和首次执行 TimerFcn 中指定的函数之间的延迟。如果 Running = 'on',则 StartDelay 是只读的。

默认: 0

'StartFcn'

字符向量、字符串标量、函数句柄或元胞数组,用于定义在计时器启动时应执行的函数。

  • 如果您使用字符向量或字符串标量指定此属性,则当 MATLAB 执行回调时,它会对字符向量中包含的 MATLAB 代码求值。

  • 如果您使用函数句柄指定此属性,当 MATLAB 执行回调时,它会将 timer 对象和事件结构体传递给回调函数。事件结构体的 Type 字段中包含事件的类型,Data 字段中包含事件的时间。

  • 如果回调函数接受除 timer 对象和事件数据以外的参数,请将此属性指定为包含函数句柄和其他参数的元胞数组。

有关详细信息,请参阅计时器回调函数

'StopFcn'

字符向量、字符串标量、函数句柄或元胞数组,用于定义在计时器停止时应执行的函数。

  • 如果您使用字符向量或字符串标量指定此属性,则当 MATLAB 执行回调时,它会对字符向量中包含的 MATLAB 代码求值。

  • 如果您使用函数句柄指定此属性,当 MATLAB 执行回调时,它会将 timer 对象和事件结构体传递给回调函数。事件结构体的 Type 字段中包含事件的类型,Data 字段中包含事件的时间。

  • 如果回调函数接受除 timer 对象和事件数据以外的参数,请将此属性指定为包含函数句柄和其他参数的元胞数组。

有关详细信息,请参阅计时器回调函数

计时器会在以下情况下停止

  • 调用计时器 stop 方法。

  • 计时器完成执行 TimerFcn。换句话说,TasksExecuted 的值达到 TasksToExecute 设置的限值。

  • 出现错误。首先调用 ErrorFcn 回调,然后调用 StopFcn 回调。

您可以使用 StopFcn 定义清理操作,例如删除内存中的计时器对象。

'Tag'

字符向量或字符串标量,表示对象的标签。

'TasksToExecute'

大于 0 的数字,指示计时器对象要执行 TimerFcn 回调的次数。使用 TasksToExecute 属性设置执行次数。要使用 TasksToExecute,您必须设置 ExecutionMode 以排定多个计时器回调事件的执行。

默认: Inf

'TimerFcn'

字符向量、字符串标量、函数句柄或元胞数组,用于定义计时器回调函数。您必须先定义此属性,然后才能启动计时器。

  • 如果您使用字符向量或字符串标量指定此属性,则当 MATLAB 执行回调时,它会对字符向量中包含的 MATLAB 代码求值。

  • 如果您使用函数句柄指定此属性,当 MATLAB 执行回调时,它会将 timer 对象和事件结构体传递给回调函数。事件结构体的 Type 字段中包含事件的类型,Data 字段中包含事件的时间。

  • 如果回调函数接受除 timer 对象和事件数据以外的参数,请将此属性指定为包含函数句柄和其他参数的元胞数组。

有关详细信息,请参阅计时器回调函数

'UserData'

要向对象添加的数据的一般字段。

属性

AveragePeriod

自计时器启动后 TimerFcn 每次执行之间的平均时间(以秒为单位)。在计时器执行完两次计时器回调之前,该值一直为 NaN

InstantPeriod

最后两次执行 TimerFcn 之间的时间(以秒为单位)。在计时器执行完两次计时器回调之前,该值一直为 NaN

Running

定义为 'off''on' 的字符向量,指示计时器当前是否正在执行回调函数。

TasksExecuted

计时器自启动后调用 TimerFcn 的次数。

Type

标识对象类型的字符向量。

方法

delete从内存中删除计时器对象
get查询计时器对象的属性值
isvalid确定计时器对象的有效性
set设置计时器对象的属性值
start启动计时器对象
startat排定计时器在指定时间触发回调
stop停止计时器对象
timerfind查找计时器对象
timerfindall查找计时器对象(无论可见性如何)
wait阻止命令提示符直到计时器停止运行

复制语义

句柄。要了解句柄类如何影响复制操作,请参阅复制对象

示例

全部折叠

将匿名函数用作回调函数来显示消息。务必注意,回调函数传递的前两个参数为计时器对象句柄和事件结构体。即使函数不使用这些参数,函数定义也需要这些参数。

等待 3 秒钟,然后显示消息“3 seconds have elapsed”。

t = timer;
t.StartDelay = 3;
t.TimerFcn = @(myTimerObj, thisEvent)disp('3 seconds have elapsed');
start(t)
3 seconds have elapsed

假定函数不需要计时器或事件对象。使用波浪号 (~) 运算符忽略输入。

t.TimerFcn = @(~,~) disp('3 seconds have elapsed');
start(t)
3 seconds have elapsed

删除计时器对象。

delete(t)

当计时器启动、触发和停止时显示事件及日期/时间输出。计时器回调函数将以 2 秒钟为间隔执行 3 次回调。回调函数传递的前两个参数为计时器对象句柄和事件结构体。事件结构体包含两个字段:Type 是一个标识导致回调的事件类型的字符向量,Data 是一个包含事件发生时的日期时间向量的结构体。

t = timer;
t.StartFcn = @(~,thisEvent)disp([thisEvent.Type ' executed '...
    datestr(thisEvent.Data.time,'dd-mmm-yyyy HH:MM:SS.FFF')]);
t.TimerFcn = @(~,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;
t.TasksToExecute = 3;
t.ExecutionMode = 'fixedRate';
start(t)
StartFcn executed 14-Mar-2013 09:08:50.865
TimerFcn executed 14-Mar-2013 09:08:50.865
TimerFcn executed 14-Mar-2013 09:08:52.865
TimerFcn executed 14-Mar-2013 09:08:54.866
StopFcn executed 14-Mar-2013 09:08:54.869

删除计时器对象。

delete(t)

创建一个计时器对象,以提醒自己在 8 小时工作期间,每 10 分钟做一次时长 30 秒的人体工学运动休息。

在名为 createErgoTimer.m 的文件中创建一个返回计时器对象的函数。在此文件中包含三个局部函数以处理计时器启动、执行和停止任务。

function t = createErgoTimer()
secondsBreak = 30;
secondsBreakInterval = 600;
secondsPerHour = 60^2;
secondsWorkTime = 8*secondsPerHour;

t = timer;
t.UserData = secondsBreak;
t.StartFcn = @ergoTimerStart;
t.TimerFcn = @takeBreak;
t.StopFcn = @ergoTimerCleanup;
t.Period = secondsBreakInterval+secondsBreak;
t.StartDelay = t.Period-secondsBreak;
t.TasksToExecute = ceil(secondsWorkTime/t.Period);
t.ExecutionMode = 'fixedSpacing';
end 

使用 StartDelay 可以先启动计时器,而不提示您立即休息。将执行模式设置为 'fixedSpacing',使完成 TimerFcn 执行花费的时间为 1030 秒 (t.Period)。这样,您就可以在下一个 10 分钟间隔开始为自己留出 30 秒的休息时间。

createErgoTimer.m 文件中,添加一个局部函数来处理与启动计时器关联的任务。默认情况下,timer 对象将其自身和事件数据传递给回调函数。该函数会忽略事件数据。

function ergoTimerStart(mTimer,~)
secondsPerMinute = 60;
secondsPerHour = 60*secondsPerMinute;
str1 = 'Starting Ergonomic Break Timer.  ';
str2 = sprintf('For the next %d hours you will be notified',...
    round(mTimer.TasksToExecute*(mTimer.Period + ...
    mTimer.UserData)/secondsPerHour));
str3 = sprintf(' to take a %d second break every %d minutes.',...
    mTimer.UserData, (mTimer.Period - ...
    mTimer.UserData)/secondsPerMinute);
disp([str1 str2 str3])
end

添加一个局部函数来处理与执行计时器关联的任务。TimerFcn 回调应指示您休息 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.

提示

  • 要强制执行事件队列中的回调函数,请在代码中包含对 drawnow 函数的调用。drawnow 函数会刷新事件队列。

在 R2006a 之前推出