作为一名自学者,我试图用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;
}
}
答案 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();
}