Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

timerfind

类: timer

查找计时器对象

说明

示例

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

示例

out = timerfind(Name,Value) 查找属性值与作为 Name,Value 对组参数传递的属性值匹配的 可见的计时器对象,并返回一个数组 out

示例

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

示例

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

输入参数

t

timer 类的对象数组

S

结构体,其字段名称对应于 timer 对象的属性名称。字段值为对应的属性值。

名称-值对组参数

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

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

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

示例

全部展开

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

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=1×6 object
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=1×3 object
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=2×1 object
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)

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

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 =

     []

详细信息

全部展开

提示

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

另请参阅

| |

在 R2006a 之前推出