QT:多线程

发布时间:2024年01月19日

方法一:写一个类,继承QThread

然后把要实现的函数写在这个类里,在run函数中调用。在需要开辟线程的地方,new一个线程类出来,通过线程的start函数运行线程,回自动执行run函数。

例如:

线程类

class CheckThread : public BaseThread
{
    Q_OBJECT
public:
    explicit CheckThread(QObject *parent = Q_NULLPTR);
    ~CheckThread();
    void checkSceneFile(NodeGraphicsScene *scene);
protected:
    void run();
private:
    NodeGraphicsScene *_scene {Q_NULLPTR};
};
CheckThread::CheckThread(QObject *parent) :BaseThread(parent)
{

}

CheckThread::~CheckThread()
{
   
}

void CheckThread::checkSceneFile(NodeGraphicsScene *scene)
{
    /***    实现的功能    ***/
}

void CheckThread::run()
{
    checkSceneFile(_scene);
}

调用线程

A文件头文件中定义线程

private:
    CheckThread * _checkThread {Q_NULLPTR};

=============================================================
A文件cpp中调用线程

void A::init(){
    //已存在就删除原来的线程
    if(_checkThread){
        if(_checkThread->isRunning()){
            delete _checkThread;
            _checkThread = Q_NULLPTR;
        }
    }

    _checkThread = new CheckThread(this);
   
    /**   中间也可以在线程类中自定义一些传数据的函数  然后在这里传入数据   **/

    _checkThread->start();
}

void A::~A(){
    //释放
    _checkThread->blockSignals(true);
    delete _checkThread;
    _checkThread = Q_NULLPTR;
}

方法二:QtConcurrent::run? ?在A文件中用线程调用A的函数

//在BlockFileTreeView文件中,调用importlotsFile函数,传入importlotsFile函数需要的参数importFiles

QFuture<void> f1 = QtConcurrent::run(this,&BlockFileTreeView::importlotsFile,importFiles);
f1.waitForFinished();

【注意】waitForFinished不是并行的,是会阻塞主线程的。

但是,我又不想要阻塞主线程,还能指定线程结束后执行什么,要怎么做?

我的做法是 利用信号槽

在线程掉用的importlotsFile函数结束的时候发送一个信号,然后在主函数接收这个信号。这样就可以不用阻塞主线程,能知道子线程结束。

文章来源:https://blog.csdn.net/Yanjun2i/article/details/135703299
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。