如何才能让Qt子线程的响应在切换到其它窗口后不变慢?
写了一个Qt5的子线程运行定时器的测试程序,子线程是用movetToThread的方式,具体如下,TimerThread* timerInSubThread = new TimerThread();
timerInSubThread->moveToThread(&m_thread); //使用moveToThread创建子线程的
connect(&m_thread, SIGNAL(started()), timerInSubThread, SLOT(onCreateTimer())); //在线程启动的时候创建定时器
connect(&m_thread, &QThread::finished, timerInSubThread, &QObject::deleteLater);
m_thread.start();
子线程定时器的时间间隔设置为5ms,
ptimer->setInterval(5);
在定时器超时中断里面打印当前时间,并计算距离上次中断的时间的时间间隔,通过qDebug打印出来。当这个测试程序窗口处于最上面的话,定时器基本都能在5ms左右触发。
但如果将浏览器或者别的窗口切换到最上面时,定时器就会变为15ms中断一次,如下如所示,x轴是超时中断次数,y轴为距离上次超时的时间间隔。
有什么方法能子线程的运行不变慢吗?
要稳得上实时系统,别难为windows,linux 也有实时版的 zyqcome 发表于 2023-4-7 13:18
要稳得上实时系统,别难为windows,linux 也有实时版的
(引用自2楼)
看来用MCU的思路来玩windows确实行不通,得把定时间隔加大才行 可以利用线程+延时方式试试 wurst 发表于 2023-4-7 19:56
可以利用线程+延时方式试试
(引用自4楼)
现在是想用子线程实时做数据处理操作,而不影响mainwindow的运行,而在windows系统切换到别的窗口程序后,就不能保证这个线程的实时性。
加延时的话更慢了。 Windows的Timer间隔最小是16ms,和你切换到后台吻合. 前台能达到5ms我怀疑是存在其他的唤醒条件.
如果需要高精度得使用HEPT
多媒体定时器可以了解一下...
foxpro2005 发表于 2023-4-8 12:48
多媒体定时器可以了解一下...
(引用自7楼)
代码里是用了PreciseTimer类型的定时器,但系统切换窗口后,线程的响应时间会变成15ms左右 N_EMBED 发表于 2023-4-8 15:59
代码里是用了PreciseTimer类型的定时器,但系统切换窗口后,线程的响应时间会变成15ms左右 ...
(引用自8楼)
在任务管理器哪里设置优先级最高是不是就好了 xmlbb 发表于 2023-4-9 17:27
在任务管理器哪里设置优先级最高是不是就好了
(引用自9楼)
应该是可行,但是手动操作有点麻烦,想看看有没有API函数可以设置优先级。 子线程+轮询时间+sleep呢? N_EMBED 发表于 2023-4-9 19:49
应该是可行,但是手动操作有点麻烦,想看看有没有API函数可以设置优先级。 ...
(引用自10楼)
你可以先手动试下,可以的话就整个脚本,在qt运行的时候自动启动这个脚本就行了。{:lol:} xmlbb 发表于 2023-4-10 09:00
你可以先手动试下,可以的话就整个脚本,在qt运行的时候自动启动这个脚本就行了。...
(引用自12楼)
程序窗口置顶的响应时间约为5ms.
程序窗口切换后的响应时间约为15ms
刚才将程序打包并单独设置程序的优先级为实时,
但实测最小化或者切换到别的窗口后响应时间还是会变为15ms左右。
也就是说,需要将程序窗口置顶才行。
页:
[1]