Qt 5 中的 C++11 线程

C++11 thread in qt 5

本文关键字:线程 C++11 中的 Qt      更新时间:2023-10-16
//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 中只使用 qDebug 语句并删除 myDialog 代码,那么即使使用线程,代码也能正常运行。问题出在哪里?我正在使用带有 MingW 4.9.1 32 位的 Qt5。而且我没有安装Visual Studio。

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

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

你可能想看看QThread.该类将允许您使用信号和插槽,这可能会使您更轻松。您可以使用传统的线程构造(例如,互斥锁、等待条件等(和共享状态。还有一些方法可以发布通过消息循环的事件(即被发送回主/GUI 线程(。