[英]C++11 thread in qt 5
//MainWindow.cpp
void MainWindow::threadedFunction()
{
myDialog = new MyDialogs(list,processList,this);
myDialog->show();
}
void MainWindow::createNewDialog()
{
getProcesses();
//threadedFunction(); //This works fine.
std::thread tx = std::thread(&MainWindow::threadedFunction,this);
tx.join();
}
//MyDialog.cpp
MyDialogs::MyDialogs(QList<int> lists,QStringList list,QObject *parent):QDialog(0)
{
QVBoxLayout *toplay = new QVBoxLayout(this);
listWidget = new QListWidget(this);
x<<list;
l<<lists;
listWidget->addItems(x);
toplay->addWidget(listWidget);
connect(listWidget,SIGNAL(doubleClicked(QModelIndex)),
this,SLOT(getProcessString(QModelIndex)));
}
void MyDialogs::getProcessString(QModelIndex index)
{
selectedProcessString = index.data().toString();
rowIndex = index.row();
}
已在專業文件中設置。
CONFIG += c++11
當我直接調用threadedFunction時,代碼工作正常。 但是上面提到的代碼給了我運行時錯誤 。 如果我在threadedFunction中僅使用qDebug語句並刪除myDialog代碼,則即使使用線程,該代碼也可以正常運行。 問題是什么? 我正在將Qt5與MingW 4.9.1 32位一起使用。 而且我沒有安裝Visual Studio。
問題是您正在嘗試在GUI線程之外創建UI對象。 我假設您的main
功能實例化了一個QApplication
對象,該對象啟動了事件循環。 該線程是您唯一的GUI線程。 我猜你的GUI線程是正在創建實例化QListWidget
的線程的線程。
如果我的假設是正確的,那么您需要在main / GUI線程中創建QListWidget
,然后調用您的線程函數。 我不確定您應該在線程函數中做什么,因為我不確定您想做什么,但是有多種方法可以處理它。
您可能想看看QThread
。 該類將允許您使用信號和插槽,這可能會使您更輕松。 您可以使用傳統的線程構造(例如互斥,等待條件等)和共享狀態。 還有一些方法可以通過消息循環發布事件(即,將事件發送回主線程/ GUI線程)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.