QT C ++ - 在线程类中使用MainWindow类QString

时间:2017-02-13 17:46:35

标签: c++ multithreading qt

我试图了解线程,以及C ++和QT的基础知识。我有一个mainWindow按钮方法,它基本上运行一个线程,并存储一个ui组合框文本的值:

void MainWindow::on_Request_Raw_Button_clicked(bool checked)
{
  if(checked)
  {
      // Store the current request into var.
      curr_request = ui->comboBox_2->currentText();
      qDebug() << curr_request << " started.\n";

      mThread->start();
  }
  else
  {
      qDebug() << "Stopped.\n";
      mThread->Stop = true;
  }
}

在线程调用中,当它运行时我想使用MainWindow中的数据成员,特别是curr_request。

test_thread::test_thread(QObject *parent) : QThread(parent)
{

}

void test_thread::run()
{
    this->Stop = false;
    QMutex mutex;
    while(true)
    {
        qDebug() << "I started.\n";
        if( this->Stop ) {
            break;
            mutex.unlock();
        }
        /* Do stuff here */
        qDebug() << "Test: " << curr_request;
        QString temp = curr_request;

        mutex.unlock();
        emit temp;

        this->usleep(900000);
    }
}

在我的mainwindow.h中

public:
  explicit MainWindow(QWidget *parent = 0);
  ~MainWindow();
  test_thread *mThread;
  QString curr_request = "";

我的主题包括mainwindow.h文件。 我收到错误:无效使用非静态数据成员&#39; curr_request&#39;。

1 个答案:

答案 0 :(得分:0)

由于curr_request是您的班级MainWindow的成员,您必须通过MainWindow的对象访问它,例如

MainWindow mainWindow;
mainWindow.curr_request = "something";

或者做这样的事情:

MainWindow* pMainWindow = QCoreApplication::instance()->findChild<MainWindow>();
QString temp = pMainWindow->curr_request;

请注意,这可能是线程安全,可能会也可能不会导致竞争条件,具体取决于您访问实例的方式。

(资料来源:有人提出了一个类似的问题here,评论了这种可能性。)