搜索
bottom↓
回复: 12

如何才能让Qt子线程的响应在切换到其它窗口后不变慢?

[复制链接]

出0入102汤圆

发表于 2023-4-7 11:59:49 | 显示全部楼层 |阅读模式
写了一个Qt5的子线程运行定时器的测试程序,子线程是用movetToThread的方式,具体如下,

  1.     TimerThread* timerInSubThread = new TimerThread();
  2.     timerInSubThread->moveToThread(&m_thread); //使用moveToThread创建子线程的
  3.     connect(&m_thread, SIGNAL(started()), timerInSubThread, SLOT(onCreateTimer())); //在线程启动的时候创建定时器
  4.     connect(&m_thread, &QThread::finished, timerInSubThread, &QObject::deleteLater);
  5.     m_thread.start();
复制代码

子线程定时器的时间间隔设置为5ms,
  1. ptimer->setInterval(5);
复制代码

在定时器超时中断里面打印当前时间,并计算距离上次中断的时间的时间间隔,通过qDebug打印出来。当这个测试程序窗口处于最上面的话,定时器基本都能在5ms左右触发。
但如果将浏览器或者别的窗口切换到最上面时,定时器就会变为15ms中断一次,如下如所示,x轴是超时中断次数,y轴为距离上次超时的时间间隔。


有什么方法能子线程的运行不变慢吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2023-4-7 13:18:39 | 显示全部楼层
要稳得上实时系统,别难为windows,linux 也有实时版的

出0入102汤圆

 楼主| 发表于 2023-4-7 15:31:40 | 显示全部楼层
zyqcome 发表于 2023-4-7 13:18
要稳得上实时系统,别难为windows,linux 也有实时版的
(引用自2楼)

看来用MCU的思路来玩windows确实行不通,得把定时间隔加大才行

出0入0汤圆

发表于 2023-4-7 19:56:47 | 显示全部楼层
可以利用线程+延时方式试试

出0入102汤圆

 楼主| 发表于 2023-4-7 22:16:45 来自手机 | 显示全部楼层
wurst 发表于 2023-4-7 19:56
可以利用线程+延时方式试试
(引用自4楼)

现在是想用子线程实时做数据处理操作,而不影响mainwindow的运行,而在windows系统切换到别的窗口程序后,就不能保证这个线程的实时性。

加延时的话更慢了。

出0入0汤圆

发表于 2023-4-7 23:49:26 | 显示全部楼层
Windows的Timer间隔最小是16ms,和你切换到后台吻合. 前台能达到5ms我怀疑是存在其他的唤醒条件.

如果需要高精度得使用HEPT

出0入76汤圆

发表于 2023-4-8 12:48:50 | 显示全部楼层
多媒体定时器可以了解一下...

出0入102汤圆

 楼主| 发表于 2023-4-8 15:59:12 | 显示全部楼层
foxpro2005 发表于 2023-4-8 12:48
多媒体定时器可以了解一下...
(引用自7楼)

代码里是用了PreciseTimer类型的定时器,但系统切换窗口后,线程的响应时间会变成15ms左右

出0入0汤圆

发表于 2023-4-9 17:27:01 来自手机 | 显示全部楼层
N_EMBED 发表于 2023-4-8 15:59
代码里是用了PreciseTimer类型的定时器,但系统切换窗口后,线程的响应时间会变成15ms左右 ...
(引用自8楼)

在任务管理器哪里设置优先级最高是不是就好了

出0入102汤圆

 楼主| 发表于 2023-4-9 19:49:43 | 显示全部楼层
xmlbb 发表于 2023-4-9 17:27
在任务管理器哪里设置优先级最高是不是就好了
(引用自9楼)

应该是可行,但是手动操作有点麻烦,想看看有没有API函数可以设置优先级。

出105入79汤圆

发表于 2023-4-9 23:20:02 | 显示全部楼层
子线程+轮询时间+sleep呢?

出0入0汤圆

发表于 2023-4-10 09:00:01 | 显示全部楼层
N_EMBED 发表于 2023-4-9 19:49
应该是可行,但是手动操作有点麻烦,想看看有没有API函数可以设置优先级。 ...
(引用自10楼)

你可以先手动试下,可以的话就整个脚本,在qt运行的时候自动启动这个脚本就行了。

出0入102汤圆

 楼主| 发表于 2023-4-10 11:17:21 | 显示全部楼层
xmlbb 发表于 2023-4-10 09:00
你可以先手动试下,可以的话就整个脚本,在qt运行的时候自动启动这个脚本就行了。  ...
(引用自12楼)

程序窗口置顶的响应时间约为5ms.



程序窗口切换后的响应时间约为15ms



刚才将程序打包并单独设置程序的优先级为实时,


但实测最小化或者切换到别的窗口后响应时间还是会变为15ms左右。

也就是说,需要将程序窗口置顶才行。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-21 00:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表