Qt 线程优先级
关于线程或许需要了解的基础函数介绍
Qt里 线程分八个等级
Constant | Value | Description |
---|---|---|
QThread::IdlePriority | 0 | scheduled only when no other threads are running. |
QThread::LowestPriority | 1 | scheduled less often than LowPriority. |
QThread::LowPriority | 2 | scheduled less often than NormalPriority. |
QThread::NormalPriority | 3 | the default priority of the operating system. |
QThread::HighPriority | 4 | scheduled more often than NormalPriority. |
QThread::HighestPriority | 5 | scheduled more often than HighPriority. |
QThread::TimeCriticalPriority | 6 | scheduled as often as possible. |
QThread::InheritPriority | 7 | use the same priority as the creating thread. This is the default. |
-
项目中用到了UDP视频传输,但是传输效率太低了,因为是开发阶段我们用的是无线网+路由器,小组的组长让我试着设置线程优先级.抢些CPU的时间提高传输效率.上学期间不怎么喜欢学习,对线程优先级只是听说过,但不了解.所以以为线程优先级就是谁优先执行.
-
为了测试,于是开了三个线程,通过setPriority()函数设置thread1,thread2,thread3的优先级(mth1,mth2,mth3).妄想按顺序输出线程里面的打印语句.其实这样测试很惭愧啊哈哈哈,这样错误在于我对线程优先级的理解是错误的,线程的优先级越高抢到CPU时间片越多,执行相同的操作耗费时间就短,相反优先级越低,抢到的时间片就越少,耗时就长.这反映在线程执行所耗费的时间上,而非线程执行顺序,因为即线程的优先级仍然无法保障线程的执行次序,只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行。介绍
-
在了解完这些后,既然线程已经开了,就多多少少写个测试.
(1). 规规矩矩创建三个线程mth1,mth2,mth3,然后在一个按键的槽函数中启动他们.
(2). 接着在线程的构造函数中设置他们的优先级,例如线程1的
(3). run()函数里面写事件,我让i自加到100000000,测试三个线程各自所耗费的时间.
头文件 #include<Windows.h>
(4). 实验结果
通过获取cpu计数器的值,来计算执行完耗时操作需要的时间,我的内个时钟频率好像是10000000.
QThread::TimeCriticalPriority 优先级:QThread::NormalPriority 优先级:
QThread::LowestPriority 优先级:
结果:通过试验分析,多多少少还是可以看出来,设置线程优先级对线程抢占CPU时间片还是有确实的影响的.
但这是把所有线程都设置为了相同的优先级…
.
.
我的目的就是测一下优先级能不能让线程执行耗时操作加快,也就是多抢写CPU的时间片
************************************************* 其实到这就可以了 *************************************************
.
.
但上面这是把所有线程都设置为了相同的优先级…若是设为不同的优先级会发生什么呢?
-
为了使结果更加明显计数累加到500000000,实验一次要等30+秒…
我把mth1优先级设为IdlePriority,mth2优先级设为NormalPriority,线程3优先级设为TimeCriticalPriority
但结果我看不懂,按上面的测试结果说,怎么也是线程mth3先执行完毕,然后还要比mth2快0.5s左右,也就是part3的差值大约为5000000,比mth1快的更多,但结果是…
可以看出线程mth3并不快,甚至有时候最慢,这是为什么?他们所有的线程不同优先级的时候会跟优先级最低的保持一致?毕竟他们同属于同一个进程嘛? -
于是我将线程mth1的优先级设为mth2相同的NormalPriority.
惊喜的发现,貌似并没有任何改变,红色的是这次实验结果,绿色的是上张图片,也就是上次试验的结果 -
不禁又想,是不是跟优先级最高的保持一致?若把最高的优先级设为NormalPriority,耗时时间应该更长的.于是把mth1,mth2设为IdlePriority,mth3设为NormalPriority.
哎和谐!果然是!,很明显的耗时比刚才多了,这肯定是因为优先级的改变,不是因为刚回了一条微信消息.噢噢 强调一下,测试的时候,电脑上有开浏览器微信Qt等,但实验过程中没有进行关闭或重新打开什么,只是回了条微信… -
不禁又一想,是不是只在一个线程里面设置优先级就可以统一所有线程的优先级了?管他呢试试,因为已经十一点多了,把计算的值设为100000000减少耗时时间,接着屏蔽掉mth1,mth2设置优先级的语句,通过设置mth3来操作,于是乎…
(1). 都不设置,大家都是默认的
结果
按照我查阅到的资料,Qt里面的线程应该有默认的优先级的,可能是NormalPriority.
(2). 设为IdlePriority
结果:
画红圈这个排除掉的话,发现线程耗时操作所用的时间果然所有的都变大了,所以设置一个线程的优先级确实可以影响到其他线程,可以这么说吧?(3) 设置为NormalPriority
结果:
这个结果表明,确实啊,Qt里面把线程的优先级都默认为这个NormalPriority了.(4).设置为TimeCriticalPriority
结果:
结果表明耗时还真变小了,我也没找到什么资料具体说明这个事情,只能靠这样总结一下.
以上:
总结一下就是:针对于Qt下的多线程(子线程),多个线程不设置优先级的时候为默认的NormalPriority,
多个线程设置了不同的优先级时所有线程与优先级最高的保持一致,
当只有一个线程设置优先级时,所有线程与它保持一致.
以上内容为自己通过本次试验做的总结,今天我只学习Qt其中或许我认为正确的潜在规律,至于原理什么的怎么解释,
还得依靠各位大佬,实在是没找到该怎么测组长要求我测的那个
组长:小白呀,想办法测一下Qt里面改变线程优先级对视频传输效率的影响!
我:好嘞!
不管怎样决定下午试试效果.
先附上上面的源码:链接:https://pan.baidu.com/s/1RRptTiUvQeaRJqZibuMbHw
提取码:1024