Main Content

timerfind

查找计时器对象

说明

示例

out = timerfind 查找可见的计时器对象并返回一个数组 out

示例

out = timerfind(Name,Value) 查找其属性值与作为 Name,Value 参数传递的属性值匹配的 可见的计时器对象,并返回数组 outValue 可以是空数组。在本例中,timerfindName 指定的属性查找具有空值的计时器。

out = timerfind(t,Name,Value)Name,Value 对组参数与 t 中列出的计时器对象进行匹配(其中 t 可以是计时器对象数组),并返回一个数组 out

out = timerfind(S) 匹配在结构体 S 中定义的属性值,并返回一个数组 outS 的字段名称是计时器对象属性名称。字段值为对应的属性值。

示例

全部折叠

创建多个单独的计时器以及计时器数组。

t1 = timer('Tag','broadcastProgress','UserData','Monday');
t2 = timer('Tag','displayProgress','UserData','Monday');
timerArr = [timer('Tag','broadcastProgress','UserData','Tuesday');
    timer('Tag','displayProgress','UserData','Tuesday');
    timer('Tag','displayProgress','UserData','Wednesday');];

查找内存中的所有计时器。

out1 = timerfind
out1 = 
Timer Object Array

   Index:  ExecutionMode:  Period:  TimerFcn:               Name:
   1       fixedSpacing    30       @(~,~)logStack()        timer-1
   2       singleShot      1        ''                      timer-2
   3       singleShot      1        ''                      timer-3
   4       singleShot      1        ''                      timer-4
   5       singleShot      1        ''                      timer-5
   6       singleShot      1        ''                      timer-6

仅查找内存中 Tag 属性值为 'displayProgress' 的计时器。

out2 = timerfind('Tag','displayProgress')
out2 = 
Timer Object Array

   Index:  ExecutionMode:  Period:  TimerFcn:               Name:
   1       singleShot      1        ''                      timer-3
   2       singleShot      1        ''                      timer-5
   3       singleShot      1        ''                      timer-6

将对 Tag 属性值为 'displayProgress' 的计时器的搜索限制到 timerArr 中的计时器对象。

out3 = timerfind(timerArr,'Tag','displayProgress')
out3 = 
Timer Object Array

   Index:  ExecutionMode:  Period:  TimerFcn:               Name:
   1       singleShot      1        ''                      timer-5
   2       singleShot      1        ''                      timer-6

定义一个包含感兴趣的 TagUserData 属性的 struct

searchStruct = struct('Tag','broadcastProgress','UserData','Monday')
searchStruct = struct with fields:
         Tag: 'broadcastProgress'
    UserData: 'Monday'

使用 struct 作为搜索条件来查找内存中的计时器对象。

out4 = timerfind(searchStruct)
out4 = 
   Timer Object: timer-2

   Timer Settings
      ExecutionMode: singleShot
             Period: 1
           BusyMode: drop
            Running: off

   Callbacks
           TimerFcn: ''
           ErrorFcn: ''
           StartFcn: ''
            StopFcn: ''

删除计时器对象。

delete(t1)
delete(t2)
delete(timerArr)

使用 timerfind 函数可以同时停止多个计时器,即使计时器变量已从工作区中删除也是如此。

创建两个计时器对象,它们生成 100 个随机数并执行一百万次。定义 StopFcn 回调,以显示消息“Timer has stopped.”。启动计时器并验证计时器是否正在运行

t1 = timer('TimerFcn','rand(100,1);',...
    'ExecutionMode','fixedSpacing','TasksToExecute',1e6,...
    'StopFcn','disp(''Timer1 has stopped.'')');
t2 = timer('TimerFcn','rand(100,1);',...
    'ExecutionMode','fixedSpacing','TasksToExecute',1e6,...
    'StopFcn','disp(''Timer2 has stopped.'')');
start([t1 t2])

从工作区清除计时器变量。

clear

使用 timerfind 手动停止计时器,并验证它们不再运行。

stop(timerfind)
t1.Running
ans = 
'off'
t2.Running
ans = 
'off'

删除这些计时器。

delete(timerfind)

通过创建计时器数组模拟拥有内存中的现有计时器。使用自定义名称创建一个计时器。列出所有可见计时器。

existingTimers = [timer timer timer];

myTimerName = 'myTimer';
anotherTimer = timer('Name',myTimerName);

timerfind
Timer Object Array

   Index:  ExecutionMode:  Period:  TimerFcn:               Name:
   1       singleShot      1        ''                      timer-1
   2       singleShot      1        ''                      timer-2
   3       singleShot      1        ''                      timer-3
   4       singleShot      1        ''                      myTimer

删除指定的计时器并列出所有可见计时器。

delete(timerfind('Name',myTimerName));
timerfind
Timer Object Array

   Index:  ExecutionMode:  Period:  TimerFcn:               Name:
   1       singleShot      1        ''                      timer-1
   2       singleShot      1        ''                      timer-2
   3       singleShot      1        ''                      timer-3

从内存中删除所有可见计时器。

delete(timerfind)

使用 timerfind 查找“丢失的”计时器对象引用。当您将计时器对象从工作区中清除但未从内存中删除时,引用将会丢失。

创建两个计时器对象。由于回调函数不需要计时器或事件对象,因此您可以使用波浪号 (~) 运算符忽略函数句柄中的输入。

t1 = timer('TimerFcn',@(~,~)disp('Timer 1 Fired!'));
t2 = timer('TimerFcn',@(~,~)disp('Timer 2 Fired!'));
whos
  Name      Size            Bytes  Class    Attributes

  t1        1x1               104  timer              
  t2        1x1               104  timer   

从工作区中清除其中一个计时器对象。要将计时器从内存中移除,请将其清除并删除。

clear t1
whos
  Name      Size            Bytes  Class    Attributes

  t2        1x1               104  timer              

尝试删除计时器 t1

delete(t1)
Undefined function or variable 't1'.

由于计时器 t1 的引用已被清除,因此无法使用 delete 将该计时器从内存中移除。

查找内存中的有效计时器对象。

out = timerfind
Timer Object Array

   Index:  ExecutionMode:  Period:  TimerFcn:               Name:
   1       singleShot      1        1x1 function_handle arraytimer-1
   2       singleShot      1        1x1 function_handle arraytimer-2

由于找到两个计时器,因此需要确定哪一个计时器已不在工作区中。

out ~= t2
ans =

     1     0

out 中的第一个计时器对象不等于 t2。此对象以前是 t1。它被重新分配给 t1。由于它仍有效,您可以启动计时器。

t1 = out(1);
start(t1)
Timer 1 Fired!

删除计时器对象。使用 timerfind 访问内存中的计时器对象。它不会复制对象,因此您不需要将 out 从内存中删除。要验证计时器已删除,请使用 timerfind

delete(t1)
delete(t2)
timerfind
ans =

     []

创建四个计时器对象。

t1 = timer('TimerFcn',@(~,~)disp('Timer 1 Fired!'));
t2 = timer('TimerFcn',@(~,~)disp('Timer 2 Fired!'));
t3 = timer('TimerFcn',@(~,~)disp('Timer 3 Fired!'));
t4 = timer('TimerFcn',@(~,~)disp('Timer 4 Fired!'));

从工作区中清除两个计时器。

clear t2 t3

timerfind 传递给 delete 以删除内存中的所有计时器对象(无论工作区中是否存在这些对象)。

delete(timerfind)
timerfind
ans =

     []

输入参数

全部折叠

要找的计时器,指定为计时器对象或计时器对象数组

示例: out = timerfind(t)

结构体,其字段名称对应于计时器属性名称。字段值为对应的属性值。

示例: out = timerfind(S)

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: out = timerfind('BusyMode','drop')

回调函数属性

全部折叠

计时器回调函数,指定为字符向量、字符串标量、函数句柄或元胞数组。您必须先定义此属性,然后才能启动计时器。要强制执行事件队列中的回调函数,请在代码中包含对 drawnow 函数的调用。drawnow 函数会刷新事件队列。

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

  • 如果您使用字符向量或字符串标量指定此属性,则当 MATLAB 执行回调时,它会对字符向量中包含的 MATLAB 代码求值。不建议将回调定义为字符向量。将函数指定为函数句柄的用法可以让 MATLAB 为回调函数提供重要信息。

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

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

示例: t = timer('TimerFcn',"MyTimerFunction(Input);")

计时器启动回调函数,指定为字符向量、字符串标量、函数句柄或元胞数组。

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

  • 如果您使用字符向量或字符串标量指定此属性,则当 MATLAB 执行回调时,它会对字符向量中包含的 MATLAB 代码求值。不建议将回调定义为字符向量。将函数指定为函数句柄的用法可以让 MATLAB 为回调函数提供重要信息。

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

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

示例: t = timer('StartFcn',@MyStartFunction(~,~))

计时器停止回调函数,指定为字符向量、字符串标量、函数句柄或元胞数组。

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

  • 如果您使用字符向量或字符串标量指定此属性,则当 MATLAB 执行回调时,它会对字符向量中包含的 MATLAB 代码求值。不建议将回调定义为字符向量。将函数指定为函数句柄的用法可以让 MATLAB 为回调函数提供重要信息。

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

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

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

  • 调用计时器 stop 方法。

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

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

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

示例: t = timer('StopFcn',@MyStopFunction(~,~))

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

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

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

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

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

示例: t = timer('ErrorFcn','disp("An error has occurred")')

计时属性

全部折叠

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

示例: t = timer('Period',5)

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

示例: t = timer('StartDelay',2)

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

示例: t = timer('TasksToExecute',5)

计时器函数回调排队,指定为下表中的值之一。使用此属性可以指定在计时器必须在上一次 TimerFcn 执行完毕之前再次执行 TimerFcn 时需采取的操作。当 Running 属性设置为 'on' 时,BusyMode 属性为只读。

BusyMode

队列为空时的行为

队列不为空时的行为

注释

'drop'

将任务添加到队列中

放弃任务

可能跳过 TimerFcn 调用

'error'

将任务添加到队列中

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

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

'queue'

将任务添加到队列中

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

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

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

示例: t = timer('BusyMode','error')

计时器函数回调调度,指定为下表中的值之一。当 Running='on' 时,ExecutionMode 为只读。下表概述了执行模式。

执行模式

时间 Period 起点

'singleShot'

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

'fixedRate'

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

'fixedDelay'

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

'fixedSpacing'

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

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

    Schematic of timing of 'singleShot' execution mode.

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

    Schematic of timing of 'fixedDelay' execution mode.

示例: t = timer('ExecutionMode','fixedDelay')

标注属性

全部折叠

计时器名称,指定为字符向量或字符串标量。

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

示例: t = timer('Name','MyTimer')

对象标签,指定为字符向量或字符串标量。

示例: t = timer('Tag','TimerTag')

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

示例: t = timer('ObjectVisibility','off')

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

示例: t = timer('UserData',"This is my first timer!")

只读属性

全部折叠

各次执行之间的平均时间,以秒为单位,指定为数值标量。在计时器执行完两次计时器回调之前,该值一直为 NaN

最后两次执行之间的时间,以秒为单位,指定为数值标量。在计时器执行完两次计时器回调之前,该值一直为 NaN

主动执行回调函数的指示符,指定为 'off''on'

计时器已执行的次数,指定为数值标量。

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

输出参数

全部折叠

找到的计时器对象,返回为由计时器对象组成数组。

详细信息

全部折叠

可见的计时器对象

可见的计时器对象是指位于内存中并且 ObjectVisibility 属性设置为 'on' 的计时器对象。

提示

  • timerfind 只寻找 可见的计时器对象。可见的计时器对象是指位于内存中并且 ObjectVisibility 属性设置为 'on' 的计时器对象。要查找隐藏但仍然有效的对象,请使用 timerfindall

版本历史记录

在 R2006a 之前推出

另请参阅

| | | |