前言

同学毕设做信号辨识,需要严格设计时钟信号,对于信号的精确产生有很高的需求,因此使用matlab的timer对象来实现该需求,本着学一个技术就要学精的原则,深入了解了matlab timer背后的实现原理,现将学习成果分享给大家。

主体

任务描述如下:

1多次执行回调函数:

显示这个事件和在计时器开始运作,运行,和结束时的日期/时间产出。计时器回调函数会以2秒的间隔执行三次。回调函数传递的前两条语句是定时器对象和事件结构的句柄。
事件结构有两个成员:类型定义了回调函数的来源,数据则是一个包含事件什么时候发生的日期时间的向量。

t = timer;
t.StartFcn = @(~,thisEvent)disp([thisEvent.Type ' executed '...datestr(thisEvent.Data.time,'dd-mmm-yyyy HH:MM:SS.FFF')]);
t.TimerFcn = @(~,thisEvent)disp([thisEvent.Type ' executed '...datestr(thisEvent.Data.time,'dd-mmm-yyyy HH:MM:SS.FFF')]);
t.StopFcn = @(~,thisEvent)disp([thisEvent.Type ' executed '...datestr(thisEvent.Data.time,'dd-mmm-yyyy HH:MM:SS.FFF')]);
t.Period = 2;
t.TasksToExecute = 3;
t.ExecutionMode = 'fixedRate';
start(t)

输出如下:

StartFcn executed 25-May-2018 20:12:16.344
TimerFcn executed 25-May-2018 20:12:19.345
TimerFcn executed 25-May-2018 20:12:21.345
TimerFcn executed 25-May-2018 20:12:23.345
StopFcn executed 25-May-2018 20:12:23.351

同样记得删除这个定时器:
delete(t)

2定义一个通用的回调函数

创建一个定时器对象来提示你在接下来的8小时中每10分钟学习30秒。
在一个名为createErgoTimer.m的文件里面创建一个返回定时器的函数。
在这个文件里包含着三个局部函数来处理定时器开始,执行和结束任务。
代码如下:

function t = createErgoTimer()
secondsBreak = 30;
secondsBreakInterval = 600;
secondsPerHour = 60^2;
secondsWorkTime = 8*secondsPerHour;
t = timer;
t.UserData = secondsBreak;
t.StartFcn = @ergoTimerStart;
t.TimerFcn = @takeBreak;
t.StopFcn = @ergoTimerCleanup;
t.Period = secondsBreakInterval+secondsBreak;
t.StartDelay = t.Period-secondsBreak;
t.TasksToExecute = ceil(secondsWorkTime/t.Period);
t.ExecutionMode = 'fixedSpacing';
end 

使用起始延迟函数允许定时器在没有指引你立即休息的情况下启动计时器。
将执行模式设置为固定空间,因此在一个时间函数执行完后将是一个固定的耗散周期10分钟30秒。这会允许你在下个10分钟的间隔之间有30秒的休息时间。

在之间新建的createErgo.m文件中,增加一个本地函数来处理对应与定时器开始的任务。作为默认,定时器对象将它自己和事件数据传递给回调函数。这个函数忽略事件数据

function ergoTimerStart(mTimer,~)
secondsPerMinute = 60;
secondsPerHour = 60*secondsPerMinute;
str1 = 'Starting Ergonomic Break Timer.  ';
str2 = sprintf('For the next %d hours you will be notified',...round(mTimer.TasksToExecute*(mTimer.Period + ...mTimer.UserData)/secondsPerHour));
str3 = sprintf(' to take a %d second break every %d minutes.',...mTimer.UserData, (mTimer.Period - ...mTimer.UserData)/secondsPerMinute);
disp([str1 str2 str3])
end  

增加一个局部函数来处理和执行和任务相关的定时器。定义的定时任务回调函数应该告诉你应该休息30秒。

function takeBreak(mTimer,~)
disp('Take a 30 second break.')
end

增加一个局部函数来处理和计时器停止相关的任务。

function ergoTimerCleanup(mTimer,~)
disp('Stopping Ergonomic Break Timer.')
delete(mTimer)
end

从内存中删除计时器任务。
在命令行输入createErgoTimer函数来创建和开始一个定时器。

t = createErgoTimer;
start(t)

运行结果

Starting Ergonomic Break Timer. For the next 8 hours you will be notified to take a 30 second break every 10 minutes.Take a 30 second break.

周期休息定时器。
开始周期休息定时器。在接下来的八个小时中每10分钟你会被提醒一次休息30秒。
你可以让这个定时器运行八小时也可以手动停止它。包括在内存里面消除这个定时器。

stop(t)

停止周期间隔定时器。


参考:

mathwork官方文档

Matlab练习:timer(定时器3)相关推荐

  1. Timer定时器开发

    Timer定时器开发 定时器的作用是不占线程的等待一个确定时间,同样通过callback来通知定时器到期. 参考:https://github.com/sogou/workflow 定时器的创建 同样 ...

  2. java Timer定时器管理类

    1.java timer类,定时器类.启动执行定时任务方法是timer.schedule(new RemindTask(), seconds*1000);俩参数分别是TimerTask子类,具体执行定 ...

  3. matlab中的timer模块,[转载]Matlab中Timer的使用

    Matlab中Timer的使用 鉴于Matlab中缺乏多线程机制,使用Timer无疑是一个很重要的工具,Matlab中Timer是一个Java对象. (1)Timer 的定义 t=timer(); 设 ...

  4. timer.schedule —— timer定时器的用法

    Java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks. 一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerT ...

  5. python timer使用-Python timer定时器两种常用方法解析

    这篇文章主要介绍了Python timer定时器两种常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 方法一,使用线程中现成的: 这种一般 ...

  6. 【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 )

    文章目录 一.Timer 定时器基本使用 二.Timer 定时器常用用法 三.Timer 源码分析 四.Timer 部分源码注释 五.源码及资源下载 参考文档 : Timer 定时器 API 文档 T ...

  7. java项目中多个定时器_在java项目中如何使用Timer定时器

    在java项目中如何使用Timer定时器 发布时间:2020-11-16 16:36:16 来源:亿速云 阅读:97 作者:Leah 在java项目中如何使用Timer定时器?很多新手对此不是很清楚, ...

  8. java timer线程结束_Java线程Timer定时器用法详细总结

    定时/计划功能主要使用的就是Timer对象,它在内部还是使用多线程的方式进行处理,所以它和线程技术还是有非常大的关联. Timer类主要作用就是设置计划任务,但封装任务的类却是TimerTask类.T ...

  9. Timer定时器控件 1130

    Timer定时器控件 1130 引入 Timer 属性

  10. c# 使用timer定时器操作,上次定时到了以后,下次还未执行完怎么处理

    c# 使用timer定时器操作,下次定时到了以后,上次还未执行完怎么办 ------解决方案------------------------------------------------------ ...

最新文章

  1. svn 分支合并(Subclipse例子)
  2. HDU-1878 欧拉回路 判定是否存在欧拉回路
  3. 151. Reverse Words in a String
  4. 答读者问(5):有关数学对程序猿的作用、研发工作岗位要求和实习对找工作的影响等问题...
  5. jedis操作set_Jedis的学习
  6. oracle列表分区ADD VALUES或DROP VALUES包含数据变化
  7. Node.js:借助formidable文件上传
  8. ORB-SLAM3学习笔记-基本概念
  9. K8S Java客户端的帮助文档
  10. Matlab图像练习程序:imrotate功能实现
  11. arcgis的重采样和插值方法
  12. C语言的进制转换以及算法实现
  13. 51系列、arduino、stm32系列驱动DAC模块TLC5615输出指定电压(可修改为波形输出)
  14. SAP BASIS ADM100 中文版 Unit 9(5)
  15. 【微信小程序宝典】从零开始做微信小程序开发
  16. 《东周列国志》第五十一回 责赵盾董狐直笔 诛斗椒绝缨大会
  17. 携程航班信息爬取(python)---第一次写博客,不好请别见外!
  18. Prometheus监控告警规则
  19. mint-ui —— checklist的使用
  20. nextcloud应用_4个Nextcloud必备编写应用程序

热门文章

  1. ways for partner
  2. give girls more options to choose
  3. Girton学院研究生宿舍守则
  4. 送你一朵小红花观后感
  5. swift operation
  6. 自动备份网站和数据库打包并上传FTP服务器并删除前30天文件
  7. MySQL分布式集群
  8. randomaccessfile在移动设备多线程多服务器下载时写入慢的问题
  9. Memcached - In Action
  10. angular $resource参数占位符释疑