如何降低 QT Gui 线程优先级?

Posted

技术标签:

【中文标题】如何降低 QT Gui 线程优先级?【英文标题】:How to lower QT Gui thread priority? 【发布时间】:2014-02-20 20:05:12 【问题描述】:

我正在 linux 中设计一个嵌入式 QT 应用程序。我的应用程序的一部分是实时音频流,它是系统的重中之重,并且必须始终满足其实时截止日期。我已将此线程设置为具有最大优先级的 FIFO:

schparam.sched_priority = sched_get_priority_max(SCHED_FIFO);
pthread_setschedparam(pthread_self(),SCHED_FIFO, &schparam)

我需要我的 QT GUI 始终让步并让这个实时进程具有优先权。所以我尝试将 QT GUI 线程优先级设置为

QThread::currentThread()->setPriority(QThread::LowestPriority);

但这仍然不起作用。如果我与 GUI 交互的时间过长,我的实时音频流就会流动。

我需要在这里设置一些其他优先级参数吗?不幸的是,切换到实时内核不是一种选择。

【问题讨论】:

您是否尝试过使用 sched_priority 而不是 QThread 的优先级切换器来设置 QThread::currentThread() 的优先级? 是的。好主意,它似乎应该工作,但没有骰子。 您认为应该归咎于 GUI 线程。你确定你的音频流线程没有起作用吗?您确定优先级更改成功了吗?音频线程如何与 gui 线程交互 - 例如,您是否无意中强制优先级反转?我认为按原样,您的问题缺乏足够的细节。 Qt 代码没问题。假设您检查错误,pthread 代码“正常”。 是的,我正在检查我的 pthreads 调用的返回值,它们都成功了。只要我不与 GUI 交互,我就可以让我的程序无休止地运行,并且它可以流式传输没有 xflow 的音频。一旦我开始在触摸屏上移动指针,几秒钟内我的音频线程就会出现下溢。关于接口,套接字监听传入的消息并在请求时生成音频线程。相同的应用程序代码可以作为 CLI 应用程序完美运行。当我在它上面打 GUI 时,我会遇到问题。 现在我想起来了,我想知道问题是不是我在使用触摸屏的设备驱动程序时占用了 CPU。不知道如何检查,或者如何防止它。 【参考方案1】:

如果您在 linux 下运行,您可以创建一个脚本并在应用程序启动后运行该脚本。

以下示例脚本使用 chrt 更改您的 Qt 应用程序线程优先级。

要使用以下脚本,您需要修改脚本以更改“your_qt_app”名称。另外,在脚本中,我将your_qt_app的线程分配为使用优先级为10的FIFO实时策略。您可以根据需要进行相应调整。

脚本中的“ps”命令也可以帮助您分析系统进程/线程的优先级。

#!/bin/bash
threads_to_change_prio="
    your_qt_app
 "

 ps -Leo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm,args  > ./threads_prio.txt
 for i in $threads_to_change_prio; do
      tids=$(cat ./threads_prio.txt | grep $i | awk 'print $2');
      for j in $tids; do        
          chrt -f -p 10 $j;
      done
 done

【讨论】:

以上是关于如何降低 QT Gui 线程优先级?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QT 中创建比主线程高优先级的线程

降低 Task.Factory.StartNew 线程的优先级

降低Task.Factory.StartNew线程的优先级

使用 pthreads 时的后台线程(很好,优先级)

QThread::start(优先级) vs Linux

线程优先级