让你提前认识软件开发(21):C程序中的定时器

第1部分 重新认识C语言

C程序中的定时器

【文章摘要

在实际的C程序中,一个模块执行多个操作是很常见的事情。如果多个操作同时进行,会出现程序效率低下、计算机CPU占用率过高等情况,这时就需要对所有操作的执行顺序作一个合理的安排,这就涉及到定时器的使用。

本文对C程序中的定时器的类型、设置和清除方法等作了详细的介绍,为相关开发工作的开展提供了参考。

【关键词

C程序  定时器  操作  开发

一、定时器的定义及分类

我们所熟悉的定时器是一个多任务定时提醒的软件,安装于电脑或手机上。举个例子,我们经常用的闹钟其实就是定时器,它会在我们设定的时间运行某种程序,在其它时间则处于休眠状态。

那么什么是C程序中的定时器呢?C程序中的定时器是程序员编写的用于定时执行某种操作的程序,是相关C代码的集合。这个定时器是“幕后的英雄”,我们能够看到的是软件所体现出来的某项功能,而看不见的是定时器所起的作用。

根据所起的作用的不同,C程序中的定时器分为如下两类:

第一类,在多个操作中设定不同操作执行顺序的定时器。在一个很大的软件模块中,同时进行多个操作会降低程序的执行效率,合理地使用定时器能够让某些操作避开程序执行的“高峰期”,达到舒缓程序执行压力的作用。这时的定时器所起的作用和在上下班时间十字路口的红绿灯的作用类似。

第二类,用于限制某种操作的执行时间,若在规定时间内没有执行该操作则作超时处理的定时器。这类定时器多用于需要和其它模块进行通信的模块中。如果一个模块向其它模块发了一个很重要的消息,需要等到其它模块答复后才能进行下一步的操作,那么定时器就在这个时候派上用场了。可以在定时器中设定本模块所能“容忍”的其它模块最迟应答的时间,如果超过了这个时间,则认为对方无应答,直接进行后续操作。

在C程序中,合理利用定时器,可提高程序的执行效率,同时可让程序体现出逻辑层次感和严密性。

二、定时器的数据结构

为了完成功能,一个典型的定时器的数据结构如下:

// 先重定义基本数据类型

typedef unsigned char        UINT8;

typedef unsigned short int  UINT16;

typedef unsigned int           UINT32;

 

// 定时器的数据结构

typedef struct

{

    ……

    ……

    UINT8   iUseFlag;            // 该定时器是否正在使用

    UINT8   iArrivedFlag;       // 使用该定时器的时间是否已到

    UINT8   iTimerType;         // 该定时器的类型

    UINT16  iModuleNo;         // 使用该定时器的模块号/进程号等信息

    UINT32  iSetTime;            // 设定该定时器的启动时间, 即相对此刻, 该定时器在多长时间之后启动

    UINT8   iTimerNo;            // 该定时器的编号

    UINT8   iQue;                  // 该定时器的存放队列

    UINT16  iQuePrev;          // 该定时器的存放位置的前一个结点

    UINT16  iQueNext;          // 该定时器的存放位置的后一个结点

    ……

    ……

} TimerStruc_T;

一个定时器结构体所包含的字段根据不同软件产品和项目组的要求而略有区别,但如上面结构体中罗列出来的字段都是需要的。字段的含义见对应字段后面的注释。

三、如何设置和清除定时器

3.1 设置定时器的流程

在实际的软件开发项目中,一般将设置定时器的流程封装为函数。在需要设置定时器的时候,只需要调用该函数即可。

设置定时器的流程如图1所示。

图1 设置定时器的流程

有关此流程的说明如下:

(1) 在设置定时器之前,先要判断该定时器是否正在使用。如果在使用中,那么要先清除定时器以释放资源。这是为了防止一个定时器有多种用途的情况。

(2) 在获取定时器存放资源之前,要对初始化及信息入队操作进行加锁处理。为了防止同样的资源被多个定时器获得。

3.2 清除定时器的流程

清除定时器的操作同样会被封装为函数。在需要清除定时器的时候,只需要调用该函数即可。

清除定时器的流程如图2所示。

图2 清除定时器的流程

有关此流程的说明如下:

(1) 在清除定时器之前,先要判断该定时器是否正在使用及清除时间是否达到。如果两者中有一个不满足,则不用清除定时器。

(2) 在清除定时器相关信息之前,为了保持操作的唯一性,同样要进行加锁处理。

四、总结

随着程序功能的日益完善和丰富,不同操作执行顺序越发显得重要,这就为定时器提供了施展才能的“舞台”。

本文以作者的实际项目开发工作为背景,对C程序中的定时器的类型、设置和清除方法等作了详细的描述,为相关模块的设计和程序的编写提供了有益的参考。

(欢迎访问南邮BBS:http://bbs.njupt.edu.cn/)
(欢迎访问重邮BBS:http://bbs.cqupt.edu.cn/nForum/index)

(本系列文章每周更新两篇,敬请期待!本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426,欢迎关注!)

让你提前认识软件开发(21):C程序中的定时器

时间: 2024-10-08 10:41:14

让你提前认识软件开发(21):C程序中的定时器的相关文章

让你提前认识软件开发(46):首先是为人编写程序,其次才是计算机

第3部分 软件研发工作总结 首先是为人编写程序,其次才是计算机 "首先是为人编写程序,其次才是计算机",这是软件开发的基本要点,软件的生命周期贯穿于产品的开发.测试.生产.发布.用户使用.版本升级和后期维护等长期过程中,只有易读.易维护的软件代码才具有生命力. 在实际的软件开发过程中,可能是由于工作很忙的原因,很多开发人员只注重实现程序的基本功能,而忘记了编程规范,因此写出来的代码只能让计算机看懂,人要看懂很不容易.更有甚者,有些项目组为了赶进度,明确要求组员以实现产品功能为主,代码能

让你提前认识软件开发(45):代码的第一印象

第3部分 软件研发工作总结 代码的第一印象 我们都很注重给别人的第一印象,也有很多书籍教我们怎样给别人留下一个美好印象的.确实,如果我们第一眼看到某个人,就觉得很不爽,那么一定会在心理上产生抵触,以后再见到他,会有一种疏远的感觉.也正因为如此,当今社会交往中的"面子工程"很重要,不管怎样,先撑足了自己的脸面再说. 代码也一样,也会给别人留下或好或差的印象.当我们看到优美的代码时,会有一种想继续研究下去的欲望,甚至会有一种觉得很享受的感觉.相反,当我们看到丑陋的代码时,就会咬牙切齿,因为

让你提前认识软件开发(44):如何解决软件故障?

第3部分 软件研发工作总结 如何解决软件故障? 在软件产品的运营维护阶段,软件工程师的一项重要工作就是解决软件的bug.在学校的时候,大家学完一门课程,然后考试通过就万事大吉了.但在实际的软件开发项目中,将软件成功交付给客户,只是"万里长征走完了第一步",后面还有大量的工作要做,例如:解决软件故障.新增功能.版本升级等.作为一名合格的软件工程师,一定要学会准确.迅速地解决软件出现的各种问题. 为什么解决软件问题的能力如此重要?因为软件项目的成功率不容乐观.国内某IT公司对本公司内软件项

让你提前认识软件开发(40):既要写好代码,又要写好文档

第3部分 软件研发工作总结 既要写好代码,又要写好文档 对于软件相关行业,在学校或单位上,大家也许都已经注意到了,除了要编写的程序.绘制设计图之外,还有一个重要的工作便是写文档.为什么要写文档呢?因为我们要把自己做的东西展示出来,不光展示给同行看,可能还要展示给其他岗位上的工作人员看,甚至展示给用户看.如果我们只是会写程序,不会在文档中描述自己的想法,那么就真正的成为"码农"了. 工作也有一段时间了,我发现周围的同事,会写高质量文档的确实很少.李开复老师在<浪潮之巅>的序言

让你提前认识软件开发(20):如何在C语言里面执行SQL语句?

[文章摘要] 在通信类软件中,程序经常需要与数据库打交道.为了实现诸如从数据库中获取数据.更新数据库表某字段.插入或删除某条数据等功能,就需要在C语言程序中构造一些SQL语句,并用函数来执行这些SQL语句. 本文介绍如何在C语言程序中构造并执行SQL语句,为相关软件开发工作的开展提供了参考. [关键词] SQL语句  C语言  程序  流程  开发 一.为什么要在C语言程序中执行SQL语句? 在C语言程序中执行SQL语句的原因有以下几个: (1) 程序需要获取数据库中某数据表的字段值,并对这些字

让你提前认识软件开发(47):同行评审

第3部分 软件研发工作总结 同行评审 在<浪潮之巅>这本书中,吴军老师描述了在Google早期的工作方式,其中有一段是这么写的:我一般会在吃完晚饭后把代码修改的清单发给克雷格做代码审核,他一般晚上10点左右会回复我,给我修改意见,详细到某一行多了一个空格. 吴军老师所描述的内容,其实就是软件开发中的同行评审流程. 几乎在所有的软件项目中,都需要同行评审.一个人不管能力多强,看问题的角度总会受到限制,写出来的程序和文档等定不会是十全十美的.如果能够让懂行的同事给参阅一下,并提出他们认为正确的意见

让你提前认识软件开发(28):数据库存储过程中的重要表信息的保存及相关建议

第2部分 数据库SQL语言 数据库存储过程中的重要表信息的保存及相关建议 1. 存储过程中的重要表信息的保存 在很多存储过程中,会涉及到对表数据的更新.插入或删除等,为了防止修改之后的表数据出现问题,同时方便追踪问题,一般会为一些重要的表建立一个对应的debug表.这个debug表中的字段要包括原表的所有字段,同时要增加操作时间.操作码和操作描述等字段信息. 例如,在某项目中,包括了如下一个重要的表tb_XXX: create table tb_XXX (      AAA           

让你提前认识软件开发(24):C语言的发展历史和主要特点

第1部分 重新认识C语言 C语言的发展历史和主要特点 作为一门众所周知的计算机编程语言,C语言是谁发明的呢?它是如何演进的?它有何特点?到底有多少人在使用它? 1. C语言之父 C语言是1972年由美国贝尔实验室的计算机科学家Dennis Ritchie(丹尼斯·里奇)设计发明的.因此,Dennis Ritchie被誉为"C语言之父"(他已于2011年10月9日去世,享年70岁).图1中的人物就是Dennis Ritchie. 图1 "C语言之父" Dennis R

让你提前认识软件开发(23):如何在C语言中执行shell命令?

第1部分 重新认识C语言 如何在C语言中执行shell命令? [文章摘要] Linux操作系统具备开源等诸多优秀特性,因此在许多通信类软件(主流开发语言为C语言)中,开发平台都迁移到了Linux上,同时shell操作在Linux的编程中占有很重要的地位,这就需要开发人员熟练掌握在C语言中执行shell命令的相关操作. 本文用实际的代码演示了如何在C语言程序中执行shell命令,为相关软件开发工作的开展提供了参考. [关键词] Linux  C语言  shell  命令  开发 一.程序执行流程