MATLAB Appdesigner开发独立桌面App全流程(二):以实时时间显示为例介绍Timer和StartupFcn的使用以及try catch抛出错误

1.以实时显示时间为例简单介绍Timer的使用

根据目前所了解到的资料,MATLAB调用多线程较为麻烦,并且类似parfor等语法只适用于大规模运算,而不适合两个独立的、需要并行的任务。这时,我们就需要使用Timer变量来实现多线程的效果。在这一小节中,我们以最基本的功能——实时显示当前时间——为例,介绍Timer变量的使用。显而易见,我们需要显示时间的功能代码自主运行,隔一定时间获取当前时间并显示,且不干扰其他任务的运行。

1.首先,在properties中添加一个定时器变量:

properties (Access = public)
    ser; % Serial
    serialname;
    model; % To store the model data
    baud = 115200; % baud rate
    datetimer; % To show time
    SerialData;
end

我们使用datetimer创建一个Timer变量,来实现实时显示时间的功能。

2.在常用控件中找到“标签”控件,将其拖拽进画布,并在控件树中将其命名为“ShowTimeLabel”:
在这里插入图片描述
注意,蓝色框框出的Label的属性“Text”即为该标签显示在画布上的内容。在Timer回调函数中,我们需要调用这一属性并给它赋值,实现显示时间的效果。

3.关于Timer变量的创建和回调函数的编写,我将放在下一节StartupFcn回调进行说明。

2.StartupFcn回调(以实时显示时间为例,结合第1节)

有些功能我们需要在App启动的时候就将其开启,例如实时显示时间的功能。这时,我们需要使用StartupFcn回调函数来实现。

1.添加StartupFcn回调:在控件树中找到最高层级(也就是我们的.mlapp工程),右键单击,找到“回调”,点击“添加StartupFcn回调”,如下图所示:
在这里插入图片描述
2.转到代码视图:
在这里插入图片描述
在这个白色代码块里,我们就可以添加我们的功能代码了。

3.创建定时器变量并开启定时器

首先,我们需要创建定时器变量,并配置它的一些基本属性。在StartupFcn回调函数中,添加如下代码:

% Code that executes after component creation
function startupFcn(app)
    % 删除现存的定时器变量。这个函数也可以用来关闭定时器
    delete(timerfind);
    % 配置并开启显示时间的定时器
    app.datetimer = timer;
    % 开启定时器代码运行后,延时1s再调用回调函数
    app.datetimer.StartDelay = 1;
    % 定时器每隔1s调用一次回调函数
    app.datetimer.Period = 1;
    % 定时器的工作模式,读者可参考官方文档查阅不同模式的区别。此模式下,定时器会循环运行
    app.datetimer.ExecutionMode = 'fixedRate';
    app.datetimer.BusyMode = 'queue';
    app.datetimer.TimerFcn = @(~,~) app.datetimer_handler;
    start(app.datetimer);
end

4.然后在MATLAB Appdesigner开发独立桌面App全流程(一)中第7节我们所添加的methods块中,添加一个公共函数:

function datetimer_handler(app)
    CT = clock; % Current Time 当前时间
    set(app.ShowTimeLabel,"Text",['当前时间:',...
    num2str(CT(1)),'年',num2str(CT(2),"%02d"),'月',num2str(CT(3),"%02d"),'日 ',...
    num2str(CT(4),"%02d"),': ',num2str(CT(5),"%02d"),': ',num2str(CT(6),"%02.f")]);
end

这个函数就是定时器变量需要调用的回调函数了。在上面的代码块中,关于时间调用使用了clock函数,并将其转化成字符串显示在我们在第1节创建的标签控件当中。num2str函数的第二个输入参数规定了显示形式和位数。关于这两个函数的使用,读者可以参考官方文档。

5.运行App,效果如下:

在这里插入图片描述
可以看到,在我们放置标签的位置,显示出了当前的时间。

同理,以此类推,我们可以使用定时器实现更加复杂的功能,比如多个后台任务的调度等。读者可以根据自己的需要,添加相应的定时器变量和对应的回调函数,以实现自己的项目需求。

3.try catch 抛出错误

考虑这样一种情况:当我们的App打包好了并正常运行起来之后,在使用过程中,因为操作失误而出现报错;或者,干脆就是因为代码存在一些在测试环境中没有检查到的bug。这个时候,我们又该如何debug呢?毕竟这时不会再有MATLAB命令行来帮助我们了。这个时候,我们就需要引入try catch来将这个错误抛出来供我们判断。

1.将MATLAB Appdesigner开发独立桌面App全流程(一)中第8节“打开串口”按钮的回调函数修改为如下的结构:

% Button pushed function: OpenSerialButton
function OpenSerialButtonPushed(app, event)
	try
    	serName = app.serialname(app.SeriallistDropDown.Value);
    	app.baud = app.BaudRateDropDown.Items{app.BaudRateDropDown.Value};
    	app.ser = serialport(serName,str2double(app.baud));
    	%% 清除缓冲区
    	flush(app.ser);
   	 	%% 设置中断回调
    	configureTerminator(app.ser,"CR/LF");
    	configureCallback(app.ser,"terminator",@app.SerialReceive_Callback);
	catch ME
       	report = getReport(ME);
      	uialert(app.UIFigure,report,'Error Message','Interpreter','html');
  	end
end

这样,我们就可以将错误信息以弹窗的形式显示在图窗上。运行App,效果如下所示:

在这里插入图片描述
未完待续…

  • 18
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
要在MATLAB App Designer中启动timer并调用App的函数,可以按照以下步骤操作: 1. 在App Designer中,选择“App Settings”选项卡,然后选择“Code View”选项卡。 2. 在代码编辑器中,添加一个类似于以下示例的timer对象: ```matlab app.Timer = timer(... 'ExecutionMode', 'fixedRate', ... 'Period', 1, ... 'TimerFcn', @(~,~)app.your_function()); ``` 在此示例中,我们使用了一个名为“Timer”的属性来存储timer对象。timer对象的“ExecutionMode”属性设置为“fixedRate”,这意味着timer将按照指定的周期(在此示例中为1秒)运行一次。 “TimerFcn”属性指定了要调用的函数,使用了一个匿名函数,该函数调用了我们在App中定义的“your_function”函数。 3. 在App Designer的“StartupFcn”回调函数中添加以下代码,以启动timer: ```matlab start(app.Timer); ``` 在此示例中,我们假设您已经将timer对象存储在了名为“Timer”的属性中。如果您使用的是不同的属性名称,则需要将其替换为相应的名称。 4. (可选)在App Designer的“CloseRequestFcn”回调函数中添加以下代码,以停止timer: ```matlab stop(app.Timer); delete(app.Timer); ``` 在此示例中,我们假设您已经将timer对象存储在了名为“Timer”的属性中。如果您使用的是不同的属性名称,则需要将其替换为相应的名称。此代码将停止timer并删除其对象。 希望这能帮助您启动timer并调用App的函数。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值