Qt使用多线程的多种方法

使用QThread 创建线程
QObject::moveToThread
  • 定义一个继承于QObject的worker类,在worker类中定义一个槽slot函数doWork(),这个函数中定义线程需要做的工作;

    class Worker:public QObject                    //work定义了线程要执行的工作
    {
        Q_OBJECT
    public:
        Worker(QObject* parent = nullptr){}
    public slots:
        void doWork(int parameter)                        //doWork定义了线程要执行的操作
        {
           //......
        }
     
    signals:
        void resultReady(const int result);               //线程完成工作时发送的信号
    };
    
    
    
  • 在要使用线程的controller类中,新建一个QThread的对象和woker类对象,使用moveToThread()方法将worker对象的事件循环全部交由QThread对象处理;

        QThread workerThread;
        Worker *worker = new Worker;
        worker->moveToThread(&workerThread); 
    
  • 建立相关的信号函数和槽函数进行连接,然后发出信号触发QThread的槽函数,使其执行工作。

    connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater); 
    
继承QThread类重写run方法
  • 自定义一个继承QThread的类MyThread,重载MyThread中的run()函数,在run()函数中写入需要执行的工作;

    class MyThread : public QThread
    {
        Q_OBJECT
    public:
        MyThread(QObject* parent = nullptr);
    protected:
        void run() override;
    };
    void MyThread::run()
    {
        for(int i = 0;i!=1000000;++i)
        {
         ++count;
        }
    }
    
  • 调用start()函数来启动线程。

      MyThread* subThread = new MyThread(this);
      connect(subThread, &MyThread::finished, subThread, [=](){
        subThread->deleteLater();
     });
        subThread->start();
    
QThreadPool
 class HelloWorldTask : public QRunnable
 {
     void run() override
     {
         qDebug() << "Hello world from thread" << QThread::currentThread();
     }
 };

 HelloWorldTask *hello = new HelloWorldTask();
 QThreadPool::globalInstance()->setMaxThreadCount(4);
 QThreadPool::globalInstance()->start(hello);
  • 创建任务类:首先,你需要创建一个任务类,这个类应该继承自QRunnable(如果想使用信号槽,可以通过多继承QObject来实现),并且实现一个具有适当参数的run()方法,这个方法将会在线程池中执行。
  • 实例化任务对象
  • 通过QThreadPool::globalInstance()->start(hello); 添加到线程池
  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值