我试图了解线程,以及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;。
答案 0 :(得分:0)
由于curr_request
是您的班级MainWindow
的成员,您必须通过MainWindow
的对象访问它,例如
MainWindow mainWindow;
mainWindow.curr_request = "something";
或者做这样的事情:
MainWindow* pMainWindow = QCoreApplication::instance()->findChild<MainWindow>();
QString temp = pMainWindow->curr_request;
请注意,这可能是不线程安全,可能会也可能不会导致竞争条件,具体取决于您访问实例的方式。
(资料来源:有人提出了一个类似的问题here,评论了这种可能性。)