【MATLAB APP开发笔记】回调函数使用

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值