我的订单购物车(0)联系客服 帮助中心供应商合作 嘉立创产业服务群
领券中心备货找料立推专区爆款推荐TI订货PLUS会员BOM配单PCB/SMT工业品面板定制

软件定时器和多线程的不同之处

2019-06-17 19:01:41阅读量:560

1 软件定时器

1、接通延时型定时器:接通延时型定时器是各种PLC中最常见最基本的定时器,这种定时器在 SIEMENS的PLC中,称为SD型定时器。
2、断开延时型定时器:这种定时器是当输入条件00000为ON时无延时作用,只有在输入条件00000为OFF时产生延时作用。在SIEMENS的PLC中,称为SF型定时器。
3、保持型接通延时定时器:这种定时器是当输入条件00000为ON后,即产生锁存功能,即使输入条件00000又变为OFF,仍视输入条件为ON,当定时器的当前值等于设定值时,定时器动作,这种定时器在SIEMENS的PLC中,称为SS型定时器。
4、脉冲型定时器:这种定时器是当输入条件00000为ON后,定时器即时动作,但经过定时器所设定的时间后,即使输入条件00000仍为ON,定时器却变为OFF状态。即这种定时器ON状态的维持时间是由设定值决定的。如果00000为ON的时续时间小于定时器的设定值,定时器的ON状态维持时间为输入条件00000为ON的持续时间。这种定时器在SIEMENS的PLC中,称为SP型定时器。
5、扩张型脉冲定时器:这种定时器与脉冲型定时器的区别是,只要输入条件00000出现了ON状态,不管其持续时间多长,均可使定时器为ON的维持的时间与定时器的设定值一致。这种定时器在SIEMENS的PLC中,称为SE型定时器。



缺点1,速度:软件定时器的精度比较低,这是由Windows不实时的特性所决定的,在XP下,如果关闭所有能关闭的进程,MFC的软件定时器可以达到接近15ms的精度,而在Win2000下,其能达到接近10ms的精度。但是实际情况是,有些进程是不可以关闭的,比如说数据库服务器,所以MFC的软件定时器能够达到的精度一般情况下在40ms左右,BCB和delphi就更差一点,大概在55ms左右。QueryPerformanceCounter倒是可以大幅提高精度,但是稳定性欠佳。


缺点2,效率:软件定时器其本质实际上是在消息循环中处理WM_TIMER消息,而WM_TIMER消息在消息队列中是一个低级别的消息,所以定时器并不能完全保证处理时间间隔的准确性。另外,TImer占用的是主线程的资源,看似并行实际上是串行,所以窗体的消息队列一旦堵塞,就会造成系统假死或者运行缓慢,这对于UI来说几乎是无法忍受的。


2 多线程区别

定时器:程序中开启两个定时器,给人的假象是好像是同时进行。。。。其实不然,就是赤裸裸的串行,

除去定时器的串行运行,以及效率不说,他其实和线程差不多少。

如下看两个定时器的运行:

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。



【内容声明】本文刊载的所有内容,包括文字、图片、音频、视频、软件、程序、以及网页版式设计等均在网上搜集。本文提供的内容或服务仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,本网站不承担任何法律责任。如涉及版权问题,请及时通知本网站删除。


广告图片