QThread和GUI线程澄清

时间:2014-01-07 10:32:44

标签: c++ qt qwidget qthread

在官方Qt文档中:

  

如上所述,每个程序在启动时都有一个线程。该线程称为“主线程”(在Qt应用程序中也称为“GUI线程”)。 Qt GUI必须在此线程中运行。所有小部件和几个相关的类(例如QPixmap)在辅助线程

中不起作用

现在,在qt项目中,我尝试了以下代码:

QThread* thread = new QThread;
DetectList *list = new DetectList;
list->moveToThread(thread);

connect(thread, SIGNAL(started()), list, SLOT(process()));
thread->start();

其中DetectList是由QWidget派生的类。为什么代码编译并运行? DetectList不一定只能在主线程中运行吗?

2 个答案:

答案 0 :(得分:2)

就像Laszlo Papp指出你正在接受战争而moveToThread没有效果。战争会说:
QObject::moveToThread: Widgets cannot be moved to a new thread

请参阅source code of moveToThread

我建议你描述一下你正在尝试做什么以及为什么你需要线程。我很确定有更好的解决方案(比如Qt Concurrent)。

答案 1 :(得分:1)

该程序将编译并运行,因为从C++正文中它在语法上是正确的。

Qt文档说的是,在与主线程不同的线程中运行GUI相关代码是不正确的,如果发生这种情况,那么应用程序可能会在运行时崩溃。

在您之前的代码中,例如,如果DetectList对象正在与某个GUI元素进行交互,那么您的程序将崩溃:

// If the process implementation interacts with GUI elements then the application will crash
void DetectList::process()
{
    // a simple gui interaction
    checkBox->setChecked(true);
}