2014-02-20 31 views
1

我正在linux中设计一个嵌入式QT应用程序。我的应用程序的一部分是实时音频流,它是系统的重中之重,必须始终满足实时最后期限。我已经将这个线程被安排为FIFO与最高优先级:如何降低QT Gui线程优先级?

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

我需要我的QT GUI总是产生,让这个实时过程有先决。所以我尝试设置QT GUI线程priorty为

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

但这仍然不起作用。如果我与GUI交互太久,我的实时音频流就是xflowing。

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

+2

您是否尝试过使用sched_priority而不是QThread的优先级切换器来设置QThread :: currentThread()的优先级? – waddlesplash

+0

是的。好的想法,它似乎应该工作,但没有骰子。 –

+1

你认为GUI线程是怪罪。你确定你的音频流线程没有起作用吗?你确定优先级更改成功了吗?音频线程如何与gui线程接口 - 你是否无意中强制优先倒置?我认为这样,你的问题缺乏足够的细节。 Qt代码是可以的。假设你检查错误,pthread代码是“OK”。 –

回答

0

如果你正在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