如何在linux中增加QT Gui线程优先级[重复]

Posted

技术标签:

【中文标题】如何在linux中增加QT Gui线程优先级[重复]【英文标题】:How to increase QT Gui thread priority in linux [duplicate] 【发布时间】:2014-07-16 06:03:12 【问题描述】:

有没有办法在 Linux 中将 gui 线程优先级设置为高于我的应用程序的其他线程? 我也知道 QThread 类中的 setPriority 函数,在 linux 中不起作用。 但是,有解决方案吗? (我正在使用 qt4.8) 非常感谢

【问题讨论】:

由于您可以访问源代码,因此您可以暂停线程,从而为 gui 线程腾出更多时间。 我不能这样做。因为我有另一个线程使用套接字并从网络获取数据。我的程序应该能够随时接收数据。由于我的套接字的吞吐量很高(从套接字获取图像并在 gui 上显示),有时我的 gui 线程工作缓慢,在某些情况下我的 gui 被冻结 拥有更高优先级的 gui 线程会导致其他线程暂停。因此,如果您手动暂停线程(毫秒)或调度程序暂停您的线程,这没有区别 如果 gui 线程冻结,那么它阻塞了一些不应该经常由不良设计引起的东西 我的建议是在PROFILER 中运行您的应用程序以查找问题的根源。我有 95% 的把握,你只是有错误的代码。 【参考方案1】:

在 GUI 线程中(例如在main())执行:

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

有关更多可能的优先级值,请参阅 Qt 文档。

【讨论】:

正如我所说,我在 linux 下工作 qt。再次查看 Qt 文档中的 setPriority 函数----> 优先级参数的效果取决于操作系统的调度策略。特别是,在不支持线程优先级的系统上,优先级将被忽略(例如在 Linux 上,有关详细信息,请参阅linux.die.net/man/2/sched_setscheduler)。 @hossein 如果您阅读 Qt 文档链接到的那个页面,您会看到它说:“调度策略和参数实际上是 Linux 上的每个线程属性。”这似乎与 Qt 关于 Linux 的注释不一致。我还不确定谁是对的,但 Qt 文档在这一点上似乎有问题。【参考方案2】:

您不需要这样做。您的 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。

【讨论】:

以上是关于如何在linux中增加QT Gui线程优先级[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何并行运行 Qt GUI 和 Linux 消息队列接收线程?

关闭 QT GUI 后如何停止线程

如何在 linux 中编写和加载 GUI? [关闭]

qt如何解决线程空转的问题

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

如何在linux平台上将控制台输出重定向到qt中的GUI