2014-02-20 28 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