qt 5中的C ++ 11线程

时间:2015-02-21 23:36:12

标签: c++ qt c++11

//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时,代码工作正常。 但是上面提到的代码给了我运行时error。 如果我在threadedFunction中只使用qDebug语句并删除myDialog代码,那么即使使用线程,代码也能正常运行。问题是什么?我使用的是Qt5和MingW 4.9.1 32bit。我没有安装visual studio。

1 个答案:

答案 0 :(得分:2)

问题是您正在尝试在GUI线程之外创建UI对象。我假设您的main函数实例化一个QApplication对象,它启动您的事件循环。这个线程是你唯一的GUI线程。我猜你的GUI线程是创建试图实例化QListWidget的线程的线程。

如果我的假设是正确的,那么你需要在main / GUI线程中创建QListWidget,然后调用你的线程函数。我不能说你应该在你的线程函数中做什么,因为我不确定你想做什么,但有多种方法可以处理它。

您可能需要查看QThread。该类允许您使用信号和插槽,这可能使您更容易。您可以使用传统的线程构造(例如,互斥,等待条件等)和共享状态。还有一些方法可以发布通过消息循环的事件(即发送回主/ GUI线程)。