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

Posted

技术标签:

【中文标题】如何在 QT 中创建比主线程高优先级的线程【英文标题】:How can i create a high priority thread than main thread in QT 【发布时间】:2014-03-24 04:53:46 【问题描述】:

我已将主线程优先级设置为 NormalPriority(3)

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    QThread::currentThread()->setPriority(QThread::NormalPriority);
    qDebug()<<"Main Priority="<< QThread::currentThread()->priority();
    MainWindow w;
    w.show();
    return a.exec();

我已经从 MainWindow.cpp 创建了另一个线程

MyThread MyThreadObj;
MyThreadObj.start(QThread::TimeCriticalPriority);

在此之后,我打印了优先级值

qDebug()<<"MainWindow Priority="<< MainWindow::thread()->priority();
qDebug()<<"MyThread Priority="<< MyThreadObj->thread()->priority();

输出是

Main Priority=3
MainWindow Priority=6
MyThread Priority=6

如何创建比主线程高优先级的线程?

【问题讨论】:

我不明白问题出在哪里。给定您的代码,输出与预期的一样。 MainWindow::thread()-&gt;priority() 没用,因为窗口必须始终位于 GUI(主线程)中。此行仅表示“返回this 线程的优先级。您似乎在线程拥有的对象中运行该行,显然是在做了错误的事情之后,即MyThreadObj-&gt;moveToThread(MyThreadObj) . 不要那样做。 我只更改了第二个线程优先级。还要改变主线程的优先级 不,它没有。打印出第一个 6 的行并没有按照您的想法执行。打印6 的两行都指向同一个线程——只需打印出您访问的thread() 的值,您就会看到。您编写了完全混淆的 C++,这与人们可能随便认为的那样。 添加Q_ASSERT(MainWindow::thread() == MyThreadObj-&gt;thread()) - 你会看到断言成功了!那是因为这条线等同于Q_ASSERT(this-&gt;thread() == MyThreadObj-&gt;thread()),并且您明显从线程的run() 方法内部调用它! 【参考方案1】:

我不明白问题出在哪里。根据您的代码,输出符合预期。

MainWindow::thread()-&gt;priority() 没用,因为窗口必须始终位于 GUI(主线程)中。此外,这条线甚至没有做你认为它做的事情。相当于调用QObject::thread()-&gt;priority(),进一步相当于this-&gt;thread()-&gt;priority()。它只是意味着“返回此线程的优先级。您似乎在线程拥有的对象中运行该行,显然是在做错事之后,即MyThreadObj-&gt;moveToThread(MyThreadObj)。不要那样做。

以下内容有望满足您的期望。请注意myThread-&gt;moveToThread 的缺席。这不是必需的。如果您需要从QThread 发出信号,请使用位于该线程中的辅助对象。或者,也许,只需使用移动到线程的普通 QObject

MyThread Priority=6
Main Priority=3
MainWindow Priority=3
int main(int argc, char *argv[])

    QApplication a(argc, argv);

    QThread myThread;
    myThread.start(QThread::TimeCriticalPriority);
    qDebug()<<"MyThread Priority="<< myThread.priority();

    Q_ASSERT_X(myThreadObj.thread() == QThread::currentThread(),
               "myThreadObj", "Usually moving a QThread to another thread is an error");

    qDebug()<<"Main Priority="<< QThread::currentThread()->priority();

    QMainWindow w;
    qDebug()<<"MainWindow Priority="<< w.thread()->priority();

    myThread.quit();
    w.show();
    return a.exec();

【讨论】:

【参考方案2】:

您可以优先考虑子线程。

Qt thread priority

【讨论】:

以上是关于如何在 QT 中创建比主线程高优先级的线程的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同的 QT 线程中创建一个窗口?

线程优先级

qt子线程如何传输数据给主线程

QT多线程问题:子线程中的变量如何传递给主线程?

QT中UI主窗口如何与子线程相互传递参数

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