QT:多线程

文章介绍了在Qt中使用QThread进行线程编程的方法,包括创建继承自QThread的自定义线程类,以及利用QtConcurrent::run进行异步执行并利用信号槽避免阻塞主线程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

例如:

线程类

class Thread : public QThread
{
    Q_OBJECT
public:
    explicit Thread (QObject *parent = Q_NULLPTR);
    ~Thread ();
    void checkSceneFile(GraphicsScene *scene);//自定义函数
protected:
    void run();
private:
    GraphicsScene *_scene {Q_NULLPTR};//自定义参数
};
Thread::CheckThread(QObject *parent) :BaseThread(parent)
{

}

Thread::~CheckThread()
{
   
}

void Thread::checkSceneFile(GraphicsScene *scene)
{
    /***    实现的功能    ***/
}

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

调用线程

A文件头文件中定义线程

private:
    Thread* _thread {Q_NULLPTR};

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

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

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

    _thread ->start();
}

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

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

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

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

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

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

我的做法是 利用信号槽

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值