2014-07-16 37 views
0

有沒有一種方法可以將gui線程優先級設置爲高於我的應用程序在Linux中的其他線程? 我也知道QThread類中的setPriority函數,不能在linux中工作。然而,有沒有解決方案呢? (我與qt4.8工作) 非常感謝如何增加Linux中的QT Gui線程優先級

+0

由於您有權訪問源代碼,因此您可以暫停您的線程,從而爲GUI線程創造更多時間。 –

+0

我不能這樣做。因爲我有另一個線程使用套接字並從網絡獲取數據。我的程序應該能夠隨時接收數據。因爲我的套接字的吞吐量很高(從套接字獲取圖像並顯示在GUI上),有時我的GUI線程運行緩慢,在某些情況下,我的GUI會凍結 – hossein

+0

具有更高優先級的GUI線程會導致其他線程暫停。因此,如果您手動暫停線程(msecs)或調度程序暫停您的線程,則它沒有區別 –

回答

0

在GUI線程(例如在main())執行:

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

見Qt的文檔的更多可能的優先級值。

+0

正如我所說,我在linux下工作qt。請再次參閱Qt文檔中的setPriority函數---->優先級參數的效果取決於操作系統的調度策略。具體而言,在不支持線程優先級的系統上,優先級將被忽略(例如,在Linux上,請參閱http://linux.die.net/man/2/sched_setscheduler以獲取更多詳細信息)。 – hossein

+0

@hossein如果您閱讀Qt文檔鏈接到的那個頁面,您會看到它說:「調度策略和參數實際上是Linux上的每個線程屬性。」這似乎不同意Qt關於Linux的說明。我還沒有確定誰是對的,但Qt文檔在這一點上似乎有問題。 – altendky

0

你不應該那樣做。您的GUI應該只顯示最新的圖像。很可能您的設計強制GUI顯示過時的圖像,即使它們不再相關。

這將Qt中實現的典型方法是由具有圖像瀏覽器類僅顯示最近設置的圖像:

class ImageViewer : public QWidget { 
    Q_OBJECT 
    QImage m_img; 
    bool m_new; 
    void paintEvent(QPaintEvent *) { 
     QPainter p(this); 
     p.drawImage(0, 0, m_img); 
     m_new = false; 
    } 
public: 
    ImageViewer(QWidget * parent = 0) : QWidget(parent), m_new(false) { 
     setAttribute(Qt::WA_OpaquePaintEvent); 
    } 
    Q_SLOT void setImage(const QImage & img) { 
     if (m_new) qDebug() << "Viewer dropped frame!"; 
     m_img = img; 
     m_new = true; 
     if (m_img.size() != size()) setFixedSize(m_img.size()); 
     update(); 
    } 
}; 

然後可以發送連接到setImage時隙信號。這些信號可能來自已被移至另一個線程的QObject

請參閱here for a complete example