Linux提供定时器机制,可以指定在未来的某个时刻发生某个事件,定时器的结构如下:struct timer_list

{

struct list_head list;

unsigned long expires;

unsigned long data;

void (*function)(unsigned long);

};

list 实现的时候使用的,和定时器功能无关

expires 是定时器定时的滴答数(当前的滴答数为 jiffies )

function 到那个时刻内核调用的函数

data 由于可能多个定时器调用一个函数,为了使得这个函数能够区分不同的定时器,

通过在结构中 data 来标识这个定时器,并且通过调用

function( data )

使得 function 能区分它们,也就是 data 起到 ID 的作用。

如何使用

将定时器加到定时器队列中

void add_timer(struct timer_list *timer)

修改定时器的到期时间

int mod_timer(struct timer_list *timer, unsigned long expires)

将定时器删除(以后这个定时器将不再起作用)

int del_timer(struct timer_list * timer)

如果不要求很精确的话,用 alarm() 和 signal() 就够了

代码:#include

#include

#include

void sigalrm_fn(int sig)

{

printf("alarm!\n");

alarm(2);

return;

}

int main(void)

{

signal(SIGALRM,signalrm_fn);

alarm(2);

while(1)

pause();

}

用select()函数可以实现定时,而且可以将时间精确到毫秒级#include

#include

#include

#include

#include

int count = 0;

void set_timer()

{

struct itimerval itv, oldtv;

itv.it_interval.tv_sec = 5;

itv.it_interval.tv_usec = 0;

itv.it_value.tv_sec = 5;

itv.it_value.tv_usec = 0;

setitimer(ITIMER_REAL, &itv, &oldtv);

}

void sigalrm_handler(int sig)

{

count++;

printf("timer signal.. %d\n", count);

}

int main()

{

signal(SIGALRM, sigalrm_handler);

set_timer();

while (count < 1000)

{}

exit(0);

}

利用定时器机制实现多线程编程

为了避免Qt系统中多线程编程带来的问题,还可以使用系统中提供的定时器机制来实现类似的功能。定时器机制将并发的事件串行化,简化了对并发事件的处理,从而避免了thread-safe方面问题的出现。

在下面的例子中,同时有若干个对象需要接收底层发来的消息(可以通过Socket、FIFO等进程间通信机制),而消息是随机收到的,需要有一个GUI主线程专门负责接收消息。当收到消息时主线程初始化相应对象使之开始处理,同时返回,这样主线程就可以始终更新界面显示并接收外界发来的消息,达到同时对多个对象的控制;另一方面,各个对象在处理完消息后需要通知GUI主线程。对于这个问题,可以利用第3节中的用户自定义事件的方法,在主线程中安装一个事件过滤器,来捕捉从各个对象中发来的自定义事件,然后发出信号调用主线程中的一个槽函数。

另外,也可以利用Qt中的定时器机制实现类似的功能,而又不必担心Thread-safe问题。下面就是有关的代码部分:

在用户定义的Server类中创建和启动了定时器,并利用connect函数将定时器超时与读取设备文件数据相关联:Server:: Server(QWidget *parent) : QWidget(parent)

{

readTimer = new QTimer(this);   //创建并启动定时器

connect(readTimer, SIGNAL(timeout()), this, SLOT(slotReadFile()));   //每当定时器超时时调用函数slotReadFile读取文件

readTimer->start(100);

}

slotReadFile函数负责在定时器超时时,从文件中读取数据,然后重新启动定时器:int Server::slotReadFile()    // 消息读取和处理函数

{

readTimer->stop();     //暂时停止定时器计时

ret = read(file, buf );   //读取文件

if(ret == NULL)

{    readTimer->start(100);     //当没有新消息时,重新启动定时器

return(-1);

}

else

根据buf中的内容将消息分发给各个相应的对象处理……;

readTimer->start(100);    //重新启动定时器

}

在该程序中,利用了类似轮循的方式定时对用户指定的设备文件进行读取,根据读到的数据内容将信息发送到各个相应的对象。用户可以在自己的GUI主线程中创建一个Server类,帮助实现底层的消息接收过程,而本身仍然可以处理诸如界面显示的问题。当各个对象完成处理后,通过重新启动定时器继续进行周期性读取底层设备文件的过程。当然,这种方法适合于各对象对事件的处理时间较短,而底层设备发来消息的频率又相对较慢的情况。在这种情况下,上述方法完全可以满足用户的需求,而又避免了处理一些与线程并发有关的复杂问题。

linux的定时器的使用,linux定时器如何使用方法相关推荐

  1. linux 多个定时器,timer: 一个Linux下的超级精简的多重定时器:可实现成千上万个定时任务,定时精度可达纳秒级别,且同一时间点可添加不同的任务!适用于云后台服务和嵌入式等各种环境。...

    MT_Timer(MT译为Multiple或Multi) 一.介绍 一个Linux下的超级简洁的定时器:利用epoll机制和timerfd新特性实现的多重.多用.多个定时任务实现.只需要使用TIMER ...

  2. Linux环境SOCKET编程5:定时器接口timerfd

    1.概述 timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景.timerfd是lin ...

  3. linux添加定时器防抖,linux驱动2.3按键中断-定时器防抖

    本节目标: 通过定时器来防止按键抖动,测试程序是使用上节的:阻塞操作的测试程序 一.引入 如下图所示,在没有定时器防抖情况下,按键没有稳定之前会多次进入中断,使得输出多个相同信息出来 按键波形图,如下 ...

  4. linux内核定时器 详解,Linux系统内核定时器机制详解(下)

    7.6.3.4 把一个定时器插入到链表中 函数add_timer()用来把参数timer指针所指向的定时器插入到一个合适的定时器链表中.它首先调用timer_pending()函数判断所指定的定时器是 ...

  5. tp5.1添加定时器任务linux,TP5 用cron实现linux定时任务

    TP5 用cron实现linux定时任务 1) tp5的控制器内容: namespace app\test\controller; use think\Controller; use think\fa ...

  6. linux操作系统的特点有哪些,LINUX操作系统有哪些概念和特点?

    嵌入式LINUX操作系统的概念 以应用为中心,以计算机技术为基础,软件.硬件可裁剪,适应应用系统对功能.可靠性.成本.体积.功耗要求严格的专用计算机系统,称为嵌入式系统.一个最小的嵌入式系统的基本组成 ...

  7. linux 保存编译log,(转)Linux下编译安装log4cxx

    一个项目的服务器端在Linux平台下,用到了开源日志库log4cxx,这个库是apache项目的一个子库.功能很不错.下面记录下它的编译和安装过程. 第一步安装apr-1.3.8,顺序不能错,它必须首 ...

  8. linux 内核 死锁 检查,一种linux内核自旋锁死锁检测报告系统和方法与流程

    本发明涉及内核死锁检测领域,具体的说是一种linux内核自旋锁死锁检测报告系统和方法. 背景技术: linux内核死锁是长期困扰内核开发人员的问题之一,但自内核引入lockdep调试模块之后,内核死锁 ...

  9. 嵌入式linux实时化技术,嵌入式Linux实时化技术

    引言 Linux支持PowerPC.MIPS.ARM.DSP等多种嵌入式处理器,逐渐被用于多种关键性场合.其中实时多媒体处理.工业控制.汽车电子等特定应用对Linux提出了强实时性需求.Linux提供 ...

  10. linux查看睡眠进程,关于 Linux 进程的睡眠和唤醒 ,来看这篇就够了~

    1 Linux 进程的睡眠和唤醒 在 Linux 中,仅等待 CPU 时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为 TASK_RUNNING.一旦一个运行中的进程时 ...

最新文章

  1. 【VBA】点击工作簿中的每个单元格,整行整列变色
  2. Spring-Security (学习记录四)--配置权限过滤器,采用数据库方式获取权限
  3. LeetCode算法系列_0862_和至少为K的最短子数组
  4. 2014恒生电子实习生笔试数据库部分
  5. “新基建”沙龙(一)精华回顾 | 5G与工业互联网的发展机遇与挑战
  6. PostgreSQL 行变列的小应用
  7. ABAP 调用第三方 API,遇到乱码该怎么办?
  8. 『设计模式』工厂方法模式
  9. jquery模拟可输入的下拉框
  10. windows下nginx的安装及使用
  11. http 请求头 header Referer 含义和作用
  12. HTML高仿哔哩哔哩(B站)视频网站整站模板
  13. srsLTE源码学习:生成多播信道表gen_mch_tables
  14. C++解析(3):布尔类型与三目运算符
  15. 软件工程基础-个人项目-数独的生成与求解
  16. TTP223-BA6,TTP223N-BA6功能描述及适用范围;
  17. 北京大学可视化发展前沿暑期学校第四讲
  18. 三人成虎,概率却不足十分之五?几个贝叶斯推理故事的分享
  19. 港科夜闻|香港科大(广州)校长倪明选教授出席江门双碳实验室第一届理事会一次会议...
  20. vue项目中,关于echarts报错:To install them, you can run: npm install --save echarts/lib/chart/bar…………

热门文章

  1. 海思3559a平台 MIPI YUV 驱动开发
  2. 3DGIS地理信息系统设计方案
  3. 英文单词和数字断行不折叠
  4. PLC编程语言汇总,留言告诉我你会哪一个?
  5. 计算机中丢失d3dx11 43.dll,帮您设置win10系统运行软件提示计算机丢失d3dx11_43.dll的图文办法...
  6. p2p借贷项目面试题
  7. 短时傅里叶变换原理解
  8. 媒体在计算机科学中的两种含义,多媒体技术应用_思考与练习题.doc
  9. 为什么说精益管理模式是适合中国企业的管理方法(zt)
  10. 2022年美容师(初级)操作证考试题库及模拟考试