定时器和多线程的不同
最近在做项目的时候,遇到了视频采集图像时。使用定时器与或使用多线程有些纠结。原先用了定时器测试了,因为项目需要占用较多的cpu,所以很明显图像显示比较卡。
所以网上查了下。贴出来大家学习学习。
软件定时器和多线程在控制工程中有着非常广泛的使用,主要是因为在控制过程中,会出现大量的Socket通信和串口通信数据量,仔细想了想,觉得这两样东西还是有比较的价值的,很多初学者(我也是。。。)可能会在这两样东西上困惑,现简单比较一下。 首先注意: 线程消息队列中WM_PAINT,WM_TIMER只有在Queue中没有其他消息的时候才会被处理,WM_PAINT消息还会被合并以提高效率。其他所有消息以先进先出(FIFO)的方式被处理。http://zhidao.baidu.com/question/176892832.html?fr=ala0。 1 软件定时器 很多同学在工程中喜欢使用软件定时器,因为其使用简单,仅需设置一个时长和其OnTime事件即可使用。确实,软件定时器在某些持续性不强的重复性工作中效率还是不错的,但是也有着很大的缺点。 缺点1,速度:软件定时器的精度比较低,这是由Windows不实时的特性所决定的,在XP下,如果关闭所有能关闭的进程,MFC的软件定时器可以达到接近15ms的精度,而在Win2000下,其能达到接近10ms的精度。但是实际情况是,有些进程是不可以关闭的,比如说数据库服务器,所以MFC的软件定时器能够达到的精度一般情况下在40ms左右,BCB和delphi就更差一点,大概在55ms左右。QueryPerformanceCounter倒是可以大幅提高精度,但是稳定性欠佳。 缺点2,效率:软件定时器其本质实际上是在消息循环中处理WM_TIMER消息,而WM_TIMER消息在消息队列中是一个低级别的消息,所以定时器并不能完全保证处理时间间隔的准确性。另外,Timer占用的是主线程的资源,看似并行实际上是串行,所以窗体的消息队列一旦堵塞,就会造成系统假死或者运行缓慢,这对于UI来说几乎是无法忍受的。 2 多线程 多线程技术是在控制工程中常用的技术,因为在闭环系统中有着大量的数据处理,这些处理显然不可能放在主线程中处理,绝大多数都是在线程中使用。多线程的优点比较明显,就是把费劲的东西扔到后台去,而且对CPU的利用率比较高。如果控制的好,多线程几乎是没有什么缺点的,但实际上控制的好的并不多……原因如下: 1、时间片不可控,抢CPU资源的事情~一般人说不清; 2、同步比较复杂,容易发生死锁,3条线程同步一般就能把人折腾死。同步我比较喜欢用临界区,原因也很简单:因为临界区比较简单…… http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c422461e4d6ce4be2329171980852d3d5aeb1e41eaf235702a0125aa99cd954dd8b8992e2a883034074fc70358c75cf28b102ad650944d9aa50e96c9e74290b9d3a3c82557dd27006d81809c2a7303bb19e71541f4d7ed5f632b07caec27148e4e7659885347a136fff7331e10f0f3ca2846d45ad3766595&p=8b2a9204809b1fb906bd9b7f0d57&user=baidu /// 1.软件开发当中经常需要用到这两个好东东,但是两个使用起来是有很大区别的哦, 2. SetTimer函数和WM_TIMER消息是Win32 api中最基本的玩意儿了,任何初学Win32 api编程的人都应该对此很熟悉吧。在这篇文章中,让我们来深入了解一下和SetTimer相关的使用和应用。 UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc ); 我们经常使用的情况是hWnd不为NULL,lpTimerFunc为NULL,在这种情况下系统每隔nIDEvent毫秒会向hWnd窗口投递WM_TIMER消息。唯一需要注意的是: 1.自2000起,uElapse范围是USER_TIMER_MINIMUM到USER_TIMER_MAXIMUM。超出得话,uElapse设置为1。 2.WM_TIMER消息其实是在DispatchMessage函数中直接调用hWnd的窗口过程,并且优先级很低,只有在消息队列中没有其它消息的情况下,DispatchMessage才会考虑WM_TIMER。 3.使用相同的nIDEvent可以重置这个Timer,并且KillTimer(hWnd,nIDEvent)来销毁这个Timer。 我们再来考虑hWnd为NULL的情况: 1.首先,最重要的是KillTimer时,传入的Timer Id必须是SetTimer的返回值,而不是调用SetTimer时传入的nIDEvent参数。 2.调用SetTimer时,如果nIDEvent为0或者是其它没有被使用的Timer Id,则SetTimer会返回一个新的Timer Id。否则,就是重新设置这个Timer。 3.如果有lpTimerFunc的话,则lpTimerFunc的参数nIDEvent是SetTimer返回的值,而不是你调用SetTimer时传入的值。 最后看一下lpTimerFunc不为NULL的情况:lpTimerFunc会在DispatchMessage函数中被直接调用,而不会去调用hWnd的窗口过程(也就是说收不到这个消息),无论hWnd是不是NULL。(这里,msdn中貌似有点问题,SetTimer的Remark部分说lpTimerFunc会在默认窗口中被调用,而WM_TIMER中说lpTimerFunc在DispatchMessage中被调用) 应用 使用lpTimerFunc可以做一个延时的操作,或者把某些操作推迟到下一个消息循环,而不需要为窗口定义一个新的Timer Id。 例如,我很喜欢这样写: struct _DATA { //.... }; void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { _DATA * data = (_DATA*)idEvent; KillTimer(hwnd,idEvent); //do something free(data); } _DATA * data = (_DATA*)malloc(sizeof(_DATA)); SetTimer(AfxGetMainWindow()->m_hWnd,(UINT_PTR)data,10,&TimerProc); 首先,使用了TimerProc,不会使窗口收到WM_TIMER消息,那样可以使用idEvent来传递自定义数据而不会和窗口自己使用的Timer id冲突。 其次,第一个参数hWnd不能为NULL,否则TimerProc的idEvent参数就不是你传入的自定义数据了。 最后,msdn说SetTimer不能跨线程使用,所以最好不要用这样的方法在向ui线程来插入代码,还是老老实实的发消息吧。 |
定时器和多线程的不同相关推荐
- C#多线程学习之(五)使用定时器进行多线程的自动管理
本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理.分享给大家供大家参考.具体分析如下: Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执 ...
- java请模拟出双重定时器_Java多线程基础 - osc_czmaebyq的个人空间 - OSCHINA - 中文开源技术交流社区...
( 1 ) 传统使用类Thread和接口Runnable实现 1. 在Thread子类覆盖的run方法中编写运行代码 方式一 newThread(){ @Overridepublic voidrun( ...
- Windows下定时器与多线程的区别
1 软件定时器 很多同学在工程中喜欢使用软件定时器,因为其使用简单,仅需设置一个时长和其OnTime事件即可使用.确实,软件定时器在某些持续性不强的重复性工作中效率还是不错的,但是也有着很大的缺点. ...
- vc中定时器并非多线程
VC++中timer很容易给人感觉是多线程的.其实不然,他是通过消息触发事件的.通过SetTimer函数设定定时器后,在规定时间内向消息队列中加入wm_timer消息来触发事件.并且只有该消息返回后才 ...
- Oracle定时器执行多线程
what里面加下面代码强制执行多线程 begin execute immediate 'alter session force parallel dml parallel 16'; pkg_s ...
- C#3种常见的定时器(多线程)
总结以下三种方法,实现c#每隔一段时间执行代码: 方法一:调用线程执行方法,在方法中实现死循环,每个循环Sleep设定时间: 方法二:使用System.Timers.Timer类: 方法三:使用Sys ...
- java 线程 定时器_java 多线程定时任务
一.概述 New Thread的弊端如下: a.每次New Thread新建对象性能差. b.线程缺乏统一的管理,可能无限制的新建线程,相互之间竞争,极可能占用过多的系统资源导致死机 或者 OOM. ...
- 关于delphi中多线程采用定时器的做法
delphi中的提供了一个tthread的多线程类,开发者可以根据自身的需要,定制相应功能的多线程,而定时器在多线程中有很广泛的应用,在这里,只说关于waitforsingleobject来做定时器的 ...
- 艾伟:C#多线程学习(六) 互斥对象
本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习( ...
最新文章
- ubuntu报错解决:The following packages have unmet dependencies:
- 四、Flash Media Server3.5安全特性
- Ubuntu下安装vscode c++环境
- 875. 爱吃香蕉的珂珂(二分)
- 素描的几大基础知识点_2020年让您感到惊奇的5大素描资源
- 我是这样分析Linux性能问题的
- Java多线程系列(十一):ReentrantReadWriteLock的实现原理与锁获取详解
- SpringBoot整合AOP + 自定义注解实现简单的权限验证
- 想让自己的网站变得精致吗?那就进来看看吧:跟随鼠标的天使
- Python Numpy中reshape函数参数-1的含义
- 使用子查询可提升 COUNT DISTINCT 速度 50 倍
- c语言中rcu缩写,ICU、MICU、EICU、NICU、NCU、CCU、RCU,科室英文缩写大全
- RS-485接口详解
- matlab量化股票基本面,获取数据 - MATLAB - 掘金量化
- 将linux系统移动硬盘,着手打造你的随身系统---将linux装进移动硬盘
- 调侃python的段子_杠精的段子 讽刺调侃杠精的说说句子
- WebGL简易教程(十一):纹理
- 牛客网错题集系列(三)
- 数据库通过出生日期计算年龄
- altera 设计--仿真--下载
热门文章
- oracle long转为string,实现全局拦截前端传入的Long类型id转String
- everything安装版和便携版有什么区别_A2奶粉内幕:国行版和澳洲版有什么区别 贵的不一定好!...
- java input是什么意思_java中的【...】表示什么意思
- 多路串口服务器的应用及应用范围介绍
- [渝粤教育] 广东-国家-开放大学 21秋期末考试工程项目管理10324k2
- [渝粤教育] 中国地质大学 大学英语(2) 复习题
- 【渝粤题库】国家开放大学2021春2476旅游学概论题目
- 国家开放大学2021春1474临床医学概论(本)题目
- 布局 线宽 间距 走线 泪滴 过孔 【快速提升PCB板Layout质量的6个细节】
- 2006 mysql_MySQL 2006 超时