定时器与线程的区别
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条线程同步一般就能把人折腾死。同步我比较喜欢用临界区,原因也很简单:因为临界区比较简单……
多个线程是“同时”执行的多个任务;定时可以看作是在本线程内插入的任务。
如果需要多个任务同时执行,就要用多线程;如果需要每隔一段时间做某件事就用定时。多线程相对复杂一些,占用系统资源略多一些,所以如果能不用多线程时尽量不用。
看项目代码的时候看到他们大部分会用到定时器,有时也会用到线程,到底线程和定时器有什么区别?
网上看了些解释:
定时器:程序中开启两个定时器,给人的假象是好像是同时进行。。。。其实不然,就是赤裸裸的串行,
除去定时器的串行运行,以及效率不说,他其实和线程差不多少。
如下看两个定时器的运行:
qtimer *time=new qtimer;
time-》start(2000);
connect(time,signal(timeout()),this,slot(slot_time1()));
qtimer *time1=new qtimer;
time1-》start(3000);
connect(time1,signal(timeout()),this,slot(slot_time2()));
void mainwindow::slot_time1()
{
qdebug()《《“------------------time1-------------------”;
for(int i=0;i《30000;i++)
{
for(int n=0;n《65000;n++)
{
;
}
}
qdebug()《《“-------------------------------------------”;
}
void mainwindow::slot_time2()
{
qdebug()《《“***********************time2****************”;
for(int i=0;i《60000;i++)
{
for(int n=0;n《65000;n++)
{
;
}
}
qdebug()《《“********************************************”;
}
在定时器1触发的时候,里面加入延迟,要是线程的话,马上就会运行第二个线程,但是定时器不是,直到第一个运行完毕,才会运行别的。
再看线程:
mythread *th=new mythread;
th-》start();
mythread1 *th1=new mythread1;
th1-》start();
void mythread::run()
{
qdebug()《《“------------------time1-------------------”;
this-》sleep(2);
qdebug()《《“-------------------------------------------”;
}
void mythread1::run()
{
qdebug()《《“********************time2*************************”;
this-》sleep(4);
qdebug()《《“**********************************************”;
}
程序开始线运行线程2,进行4s延迟,在这期间,并没有阻塞,而是去运行线程1 2s过后,再回到线程2。
总结:
所以在运行几个耗时的功能的时候,尽可能的去用线程,而不是定时器,虽然定时器很简单,容易维护。
但是定时器并没有减少程序的运行时间,以及内存。只不过是代码相对于好写,好维护些而已.
华为Mate40 Pro iPhone12 iPhone XS Max三款手机拍照谁更胜一筹?
Oculus Quest正在大力推动线下竞技VR的崛起
AI遇上中国机长会怎么样
vr和3d有什么区别
激励器和效果器连接
定时器与线程的区别
你真的了解飞控是什么吗?仔细解读多轴飞行器的飞控是如何运行的
新专利曝光:水下摄影或成为iPhone的下一个杀手锏!
中国电信2018年CN2-DCI网络扩容工程已具备采购条件
灵汐科技荣登“2022中国AI芯片企业50强”榜单
一文详解光耦继电器的应用电路
如何理解阻抗不匹配时的反射问题(阻抗不匹配的后果)
小狗电器让居家清洁变得高效便捷
PCB布局和参考回流路径的设计对电路EMC性能的影响
为什么说现代CPU架构并不适用于AI?
智能灌溉控制系统
板装式压力传感器在工业生产安全中的应用
ATA-3000系列功率放大器在精密微流体控制中的典型应用
ED3L双轴伺服驱动器三大应用优势
因存储器价格下跌,全球半导体市场的增长步伐将出现放缓