如何在线程在QT中完成工作时使用GUI?

时间:2015-06-25 12:30:23

标签: c++ multithreading qt

作为一名自学者,我试图用QThread来理解c ++中的QT逻辑。我编写了简单的线程类,里面有for循环。但是当线程在for循环中时,我无法使用MainWindow。要尝试它,我打开QFileDialog并选择一些文件。当我按下" Open"按钮线程运行,FileDialog没有关闭,直到线程完成他的工作。

线程在后台工作时是否可以使用MainWindow?

这是我尝试的简单代码..

void MainWindow::on_pushButton_clicked()
{
    QFileDialog *lFileDialog = new QFileDialog(this, "Select Folder", "/.1/Projects/", "*");

    QStringList selectedFileNames = lFileDialog->getOpenFileNames(this, "Select Images", "/home/mg/Desktop/", "", 0, 0);

    if(!selectedFileNames.isEmpty())
    {
        MyThread mThread1;
        mThread1.name = "thread1";
        mThread1.run();
        mThread1.wait();
    }
}


void MyThread::run()
{
    for (int var = 0; var < 100000; ++var)
    {
        qDebug() << this->name << var;
    }
}

2 个答案:

答案 0 :(得分:5)

你不应该{* 1}}点击处理程序中的线程! 另外,你自己不打电话给wait()线程,你只需要启动线程。启动该主题将调用run

答案 1 :(得分:1)

这是使用线程阻止代码的最小示例。主线程保持交互并每秒输出tick...,直到线程完成。当胎面完成时,它会干净地退出。

虽然我演示了一个控制台应用程序,但这可能很容易成为一个GUI应用程序,并且GUI线程在任何时候都不会被阻止。

#include <QCoreApplication>
#include <QThread>
#include <QTimer>
#include <QTextStream>
#include <cstdio>

class MyThread : public QThread {
  void run() Q_DECL_OVERRIDE {
    sleep(10); // block for 10 seconds
  }
public:
  MyThread(QObject * parent = 0) : QThread(parent) {}
  ~MyThread() {
    wait(); // important: It's illegal to destruct a running thread!
  }
}

int main(int argc, char ** argv) {
  QCoreApplication app(argc, argv);
  QTextStream out(stdout);
  MyThread thread;
  QTimer timer;
  timer.start(1000);
  QObject::connect(&timer, &QTimer::timeout, [&out]{
    out << "tick..." << endl;
  }
  app.connect(&thread, SIGNAL(finished()), SLOT(quit()));
  thread.start();
  return app.exec();
}