有沒有一種方法可以將gui線程優先級設置爲高於我的應用程序在Linux中的其他線程? 我也知道QThread類中的setPriority函數,不能在linux中工作。然而,有沒有解決方案呢? (我與qt4.8工作) 非常感謝如何增加Linux中的QT Gui線程優先級
回答
在GUI線程(例如在main()
)執行:
QThread::currentThread()->setPriority(QThread::HighPriority);
見Qt的文檔的更多可能的優先級值。
正如我所說,我在linux下工作qt。請再次參閱Qt文檔中的setPriority函數---->優先級參數的效果取決於操作系統的調度策略。具體而言,在不支持線程優先級的系統上,優先級將被忽略(例如,在Linux上,請參閱http://linux.die.net/man/2/sched_setscheduler以獲取更多詳細信息)。 – hossein
@hossein如果您閱讀Qt文檔鏈接到的那個頁面,您會看到它說:「調度策略和參數實際上是Linux上的每個線程屬性。」這似乎不同意Qt關於Linux的說明。我還沒有確定誰是對的,但Qt文檔在這一點上似乎有問題。 – altendky
你不應該那樣做。您的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
。
- 1. 在Linux中增加線程的優先級
- 2. 如何降低QT Gui線程優先級?
- 3. 在Qt中設置GUI線程的優先級
- 4. 如何增加pthread中的線程優先級?
- 5. 流程優先與線程優先級
- 6. 線程優先級
- 7. 如何增加POSIX線程優先級的範圍?
- 8. Windows和Linux線程優先級等價
- 9. Linux 2.6.x中計算的線程動態優先級如何?
- 10. 增加進程優先級與pthread_win32
- 11. Android的線程優先級
- 12. 線程優先級的Android
- 13. 更改線程優先級
- 14. 在等待句柄上增加線程優先級
- 15. 如何指定線程優先級?
- 16. 線程內線程的優先級
- 17. 如何以編程方式增加IntentFilter的優先級
- 18. Linux APIC中斷優先級
- 19. 在Linux中更改線程優先級和調度程序
- 20. 通過了解線程的優先級來設置線程的優先級
- 21. 增加布局約束的優先級
- 22. 線程 - 優先級突發事件與優先級
- 23. 如何增加IIS進程優先級(對於w3wp和iis apppool)?
- 24. Java中的高優先級線程
- 25. 如何增加FinalizerThread在GC中收集對象的優先級
- 26. 是nice()用來改變線程優先級還是進程優先級?
- 27. 使用Boost在Linux中設置線程優先級
- 28. 在Windows上增加io優先級?
- 29. 優先級隊列增加鍵opeartion
- 30. 使用accept()(Linux)的Boost線程的性能/優先級
由於您有權訪問源代碼,因此您可以暫停您的線程,從而爲GUI線程創造更多時間。 –
我不能這樣做。因爲我有另一個線程使用套接字並從網絡獲取數據。我的程序應該能夠隨時接收數據。因爲我的套接字的吞吐量很高(從套接字獲取圖像並顯示在GUI上),有時我的GUI線程運行緩慢,在某些情況下,我的GUI會凍結 – hossein
具有更高優先級的GUI線程會導致其他線程暫停。因此,如果您手動暫停線程(msecs)或調度程序暫停您的線程,則它沒有區別 –