一、通过moveToThread来创建线程
class Worker : public QObject { Q_OBJECT signals: void resultReady(const QString& result); public slots: void doWork(const QString& szParam) { qDebug() << "线程入口" << szParam; for(int i = 0; i < 10 ;++i){ QThread::sleep(1); qDebug() << "正在执行:" << i; } emit resultReady("game over"); qDebug() << "线程出口"; } };
点击某个按钮,来创建一个线程
Worker * worker = new Worker; // 将worker对象置入到线程中 worker->moveToThread(&m_thread); // 将线程处理的结果传递给主线程处理 connect(worker,&Worker::resultReady,this,&MainWindow::myHandleResult); // 线程结束后,删除worker指针,防止内存泄漏 connect(&m_thread,&QThread::finished,worker,&Worker::deleteLater); // 由于worker置入到线程中后并没有执行dowork函数,需要主线程发出启动信号 connect(this,&MainWindow::operate,worker,&Worker::doWork); // 线程启动,并挂起 m_thread.start(); qDebug() << "线程开始了";
点击另一个按钮来发出一个启动信号
qDebug() << "发出了启动dowork的信号"; emit operate("Hello world");
二、通过继承QThread来创建一个线程
class Worker : public QThread { Q_OBJECT protected: void run() { qDebug() << "线程入口"; for(int i = 0; i < 10 ;++i){ QThread::sleep(1); qDebug() << "正在执行:" << i; } emit resultReady("game over"); qDebug() << "线程出口"; } signals: void resultReady(const QString& result); };
点击按钮,开始执行线程
Worker * worker = new Worker; // 将线程处理的结果传递给主线程处理 connect(worker,&Worker::resultReady,this,&MainWindow::myHandleResult); // 线程结束后,删除worker指针,防止内存泄漏 connect(worker,&Worker::finished,worker,&Worker::deleteLater); // 线程启动,并直接运行 worker->start(); qDebug() << "线程开始了";
三、通过QtConcurrent来创建线程
pro中加入concurrent扩展
class Worker : public QObject { Q_OBJECT signals: void resultReady(const QString& result); public: void doWork(const QString& szParam) { qDebug() << "线程入口" << szParam; for(int i = 0; i < 10 ;++i){ QThread::sleep(1); qDebug() << "正在执行:" << i; } emit resultReady("game over"); qDebug() << "线程出口"; } };
通过点击按钮,来创建一个线程
void MainWindow::on_buttonTest_clicked() { Worker * worker = new Worker; // 将线程处理的结果传递给主线程处理 connect(worker,&Worker::resultReady,this,&MainWindow::myHandleResult); // 线程结束后,删除worker指针,防止内存泄漏 connect(this,&MainWindow::threadFinished,worker,&Worker::deleteLater); // 线程启动,直接执行 QtConcurrent::run(worker,&Worker::doWork, QString("Thread 1")); // 可以通过返回值的waitForFinished来同步等待线程结束 qDebug() << "线程开始了"; } void MainWindow::myHandleResult(const QString &result) { qDebug() << result; emit threadFinished(); }