N_EMBED 发表于 2023-4-7 11:59:49

如何才能让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轴为距离上次超时的时间间隔。


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

zyqcome 发表于 2023-4-7 13:18:39

要稳得上实时系统,别难为windows,linux 也有实时版的

N_EMBED 发表于 2023-4-7 15:31:40

zyqcome 发表于 2023-4-7 13:18
要稳得上实时系统,别难为windows,linux 也有实时版的
(引用自2楼)

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

wurst 发表于 2023-4-7 19:56:47

可以利用线程+延时方式试试

N_EMBED 发表于 2023-4-7 22:16:45

wurst 发表于 2023-4-7 19:56
可以利用线程+延时方式试试
(引用自4楼)

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

加延时的话更慢了。

MasterPhi 发表于 2023-4-7 23:49:26

Windows的Timer间隔最小是16ms,和你切换到后台吻合. 前台能达到5ms我怀疑是存在其他的唤醒条件.

如果需要高精度得使用HEPT

foxpro2005 发表于 2023-4-8 12:48:50

多媒体定时器可以了解一下...

N_EMBED 发表于 2023-4-8 15:59:12

foxpro2005 发表于 2023-4-8 12:48
多媒体定时器可以了解一下...
(引用自7楼)

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

xmlbb 发表于 2023-4-9 17:27:01

N_EMBED 发表于 2023-4-8 15:59
代码里是用了PreciseTimer类型的定时器,但系统切换窗口后,线程的响应时间会变成15ms左右 ...
(引用自8楼)

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

N_EMBED 发表于 2023-4-9 19:49:43

xmlbb 发表于 2023-4-9 17:27
在任务管理器哪里设置优先级最高是不是就好了
(引用自9楼)

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

qwe2231695 发表于 2023-4-9 23:20:02

子线程+轮询时间+sleep呢?

xmlbb 发表于 2023-4-10 09:00:01

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

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

N_EMBED 发表于 2023-4-10 11:17:21

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

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



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



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


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

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


页: [1]
查看完整版本: 如何才能让Qt子线程的响应在切换到其它窗口后不变慢?