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