QT - 多线程

一、通过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();
}

猜你喜欢

转载自blog.csdn.net/wyansai/article/details/80552423
今日推荐