1. 使用场景
APP开发中,通过回调函数处理各种事件。如创建一个定时器,定时打印LOG文件,这个打印LOG文件的事件就可以通过回调函数完成。几乎所有对象需要用到回调函数。
2. 格式
回调函数可以没有输入参数。
function function_name_callback (~,~)
也可以包含输入参数。
function function_name_callback (object,event,arg1[可选],arg2[可选],arg3[可选]...)
简单的回调函数可以直接在指定回调函数的时候直接给出,详见后文。
3. 指定回调函数
声明一个对象后通常需要指定回调函数,如声明一个定时器,声明定时执行的回调。
timer对象属性如下
% 声明定时器对象时直接修改回调函数属性。
% -> 回调函数不带额外参数(arg1,arg2,arg3...)时,可不指定输入参数。
% -> 不指定输入参数,可以表示没有任何输入参数,
% 也可以表示只传入了当前对象句柄(timer_id >>> object)
timer_id = timer('TimerFcn',@timer_handler);
timer_id = timer('TimerFcn',{@timer_handler,argin1,argin2,argin3...});
% 为已经存在的对象指定回调函数
timer_id.TimerFcn = @timer_handler;
timer_id.TimerFcn = {@timer_handler,argin1,argin2,argin3...};
4. 参数交互
4.1 传入参数
为一个对象指定函数时,传入参数的方法有多种。第2章节中的例子已经展示了一种传入自定义参数的方法。
本节将介绍如何通过对象的UserData属性进行参数输入。
% 将需要输入回调函数的参数组合成结构体,放入UserData属性中随对象实例一起传入回调函数
usr.arg_a = 0;
usr.arg_b = 0;
usr.arg_c = 0;
...
timer_id.UserData = usr;
timer_id.TimerFcn = @timer_handler;
4.2 传出参数
通过UserData将输出参数传出。
function timer_handler(timer_id,~)
usr = timer_id.UserData;
counter = usr.count;
% persistent counter;
if isempty(counter)
counter = 0;
end
fprintf(1,'定时器回调=%d\n',counter);
counter = counter+1;
usr.count = counter;
if counter >= 10
usr.flag = 1;
end
timer_id.UserData = usr;
end
下面是一个定时器回调的demo。
% 启动定时器
clear all;
clc;
usr.count = 0;
usr.flag = 0;
timer_id = timer;
timer_id.StartDelay = 1.0;
timer_id.Period = 1.0;
% 周期性执行,fixedSpacing模式
timer_id.ExecutionMode = 'fixedSpacing';
timer_id.UserData = usr;
timer_id.TimerFcn = @timer_handler;
%启动定时器
start(timer_id);
while 1
pause(1);
usr = timer_id.UserData;
if usr.flag > 0
stop(timer_id);
delete(timer_id);
fprintf(1,'定时器结束。\n');
break;
end
end
回调函数
function timer_handler(timer_id,~)
usr = timer_id.UserData;
counter = usr.count;
if isempty(counter)
counter = 0;
end
fprintf(1,'定时器回调=%d\n',counter);
counter = counter+1;
usr.count = counter;
if counter >= 10
usr.flag = 1;
end
timer_id.UserData = usr;
end
执行结果。
5. 参考链接
1. https://ww2.mathworks.cn/help/matlab/creating_guis/share-data-among-callbacks.html
2. https://ww2.mathworks.cn/help/matlab/matlab_prog/timer-callback-functions.html#f9-39598
3. https://ww2.mathworks.cn/help/matlab/ref/struct.html
4. https://ww2.mathworks.cn/help/matlab/creating_guis/share-data-among-callbacks.html
5. https://zhuanlan.zhihu.com/p/136570344