簡體   English   中英

QThread和GUI線程說明

[英]QThread and GUI Thread clarification

在官方的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是否不必僅在主線程中運行?

就像Laszlo Papp指出的那樣,您正在收到交戰,而moveToThread無效。 交戰時會說:
QObject::moveToThread: Widgets cannot be moved to a new thread

請參見moveToThread的源代碼

我建議您描述一下您要做什么,以及為什么需要線程。 我很確定有更好的解決方案(例如Qt Concurrent)。

該程序將編譯並運行,因為在C++語法上它是正確的。

Qt文檔說的是,與GUI相關的代碼在與主線程不同的線程中運行是不正確的,如果發生這種情況,則應用程序可能會在運行時崩潰。

例如,在您之前的代碼中,如果DetectList是object與某些GUI元素進行交互,則您的程序將崩潰:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM