簡體   English   中英

Qt 5中的C ++ 11線程

[英]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.

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