计时器回调函数
注意
如果回调涉及占用大量 CPU 的任务(例如更新图窗),则可能延迟执行回调函数。
将命令与计时器对象事件关联
计时器对象支持的属性允许您指定在计时器触发时执行的 MATLAB® 命令,以及针对其他计时器对象事件(例如启动、停止或出现错误时)指定这些命令。这称为回调。要将 MATLAB 命令与计时器对象事件关联,请设置关联的计时器对象回调属性的值。
下图显示了在执行计时器对象期间何时发生事件,并提供与每个事件关联的计时器对象属性的名称。例如,要将 MATLAB 命令与启动事件关联,请为 StartFcn
回调属性赋值。错误回调随时都会发生。
计时器对象事件和相关的回调函数
创建回调函数
当计时器对象指定的时间段过去后,计时器对象会执行您所选择的一个或多个 MATLAB 函数。您可以将这些函数直接指定为回调属性的值。您还可以将这些命令放入函数文件中,并将该函数指定为回调属性的值。
直接指定回调函数
本示例创建一个在 5 秒后显示问候语的计时器对象。本示例直接指定 TimerFcn
回调属性的值,并将命令放入字符向量中。
t = timer('TimerFcn',@(x,y)disp('Hello World!'),'StartDelay',5);
注意
当您将回调命令直接指定为回调函数属性的值时,将在 MATLAB 工作区中计算这些命令。
将命令放在调用函数中
您可以将 MATLAB 命令放在 MATLAB 程序文件中并将该文件指定为回调属性的值,而不用直接将这些命令指定为回调属性的值。
当您创建回调函数时,前两个参数必须是计时器对象句柄和事件结构体。事件结构体包含两个字段:Type
和 Data
。Type
字段包含一个字符向量,用于标识导致回调的事件类型。此字段的值可以是以下任何一项:'StartFcn'
、'StopFcn'
、'TimerFcn'
或 'ErrorFcn'
。Data
字段包含事件发生的时间。
除了这两个必需的输入参数外,您的回调函数还可以接受应用程序特定的参数。要获得这些输入参数,您必须在将该函数的名称指定为回调属性的值时使用元胞数组。有关详细信息,请参阅指定回调函数属性的值。
示例:编写回调函数
本示例实现一个简单回调函数,用以显示触发回调的事件类型及发生回调的时间。为演示如何传递应用程序特定的参数,该回调函数示例接受字符向量作为额外参数并在显示输出中包含此文本。要查看本函数所使用回调属性,请参阅指定回调函数属性的值。
function my_callback_fcn(obj, event, text_arg) txt1 = ' event occurred at '; txt2 = text_arg; event_type = event.Type; event_time = datestr(event.Data.time); msg = [event_type txt1 event_time]; disp(msg) disp(txt2)
指定回调函数属性的值
通过设置适当的回调属性的值可将回调函数与特定事件关联起来。可将回调函数指定为元胞数组或函数句柄。如果您的回调函数接受额外的参数,则必须使用元胞数组。
下表显示了若干回调函数示例的语法并介绍了调用方式。
回调函数语法 | 如何指定为对象 |
---|---|
| t.StartFcn = @myfile |
| t.StartFcn = @(~,~)myfile |
| t.StartFcn = {@myfile, 5, 6} |
本示例演示了可以指定计时器对象回调函数属性值的多种方法,其中某些方法带参数,某些不带。要查看回调函数 my_callback_fcn
的代码,请参阅示例:编写回调函数:
创建一个计时器对象。
t = timer('StartDelay', 4, 'Period', 4, 'TasksToExecute', 2, ... 'ExecutionMode', 'fixedRate');
指定
StartFcn
回调的值。请注意,本示例用元胞数组指定该值,这是因为回调函数需要访问传递过来的参数:t.StartFcn = {@my_callback_fcn, 'My start message'};
指定
StopFcn
回调的值。同样,用元胞数组指定该值,这是因为回调函数需要访问传递过来的参数:t.StopFcn = { @my_callback_fcn, 'My stop message'};
指定
TimerFcn
回调的值。本示例用字符向量来指定 MATLAB 命令:t.TimerFcn = @(x,y)disp('Hello World!');
启动计时器对象:
start(t)
本示例的输出结果如下。
StartFcn event occurred at 10-Mar-2004 17:16:59 My start message Hello World! Hello World! StopFcn event occurred at 10-Mar-2004 17:16:59 My stop message
用完计时器对象后将其删除。
delete(t)