QT多线程创建的误区:run函数

╰+攻爆jí腚メ 2022-02-26 20:16 403阅读 0赞

直接上代码吧,注意这种方法创建的多线程,只有run函数内的属于新的线程,OnTempTimer()虽然是run函数调用的,但是是主线程在执行,一定要注意啊。这样弄相当于没有任何意义,还是主线程在处理函数。
下一个博客有讲怎么实现多线程的正确创建和使用

MainWindow.cpp

  1. MysqlThread = new ReconnectMysql();
  2. MysqlThread->start();

reconnectmysql.cpp

  1. #include "reconnectmysql.h"
  2. ReconnectMysql::ReconnectMysql()
  3. {
  4. }
  5. void ReconnectMysql::run()
  6. {
  7. qDebug()<< "run()";
  8. //Timer = new QTimer(this);这样写会报错:
  9. //Parent is ReconnectMysql(0xd621978), parent's thread is QThread(0x4ac5dd0),
  10. //current thread is ReconnectMysql(0xd621978)
  11. Timer = new QTimer();//或者Timer = new QTimer(NULL);
  12. //这句话也要在run()不能像这样给定时器指定父对象 Timer = new QTimer(this);
  13. Timer->start(1000);
  14. connect(Timer, SIGNAL(timeout()), this, SLOT(OnTempTimer()));
  15. this->exec();//不加这句话定时器不执行
  16. }
  17. void ReconnectMysql::OnTempTimer()
  18. {
  19. qDebug()<< "OnTempTimer()";
  20. }

reconnectmysql.h 注意继承的QThread

  1. #ifndef RECONNECTMYSQL_H
  2. #define RECONNECTMYSQL_H
  3. #include <QObject>
  4. #include <QThread>
  5. #include <QTimer>
  6. #include <QDebug>
  7. class ReconnectMysql : public QThread
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit ReconnectMysql();
  12. void run();
  13. signals:
  14. public slots:
  15. void OnTempTimer();
  16. private:
  17. QTimer *Timer;
  18. };
  19. #endif // RECONNECTMYSQL_H

打印:
在这里插入图片描述

怎么验证以上的说法呢,很简单,用这个函数QThread::currentThreadId();获取当前线程的ID

  1. qDebug()<<tr("主线程id:")<<QThread::currentThreadId();
  2. //多线程方式1
  3. myThread = new MyThread();
  4. myThread->start();
  5. void MyThread::run()//只有run()里面在新的线程里
  6. {
  7. qDebug()<<tr("mythread QThread::currentThreadId()==")<<QThread::currentThreadId();
  8. //这种方式还是相当于在主线程里面执行
  9. timer= new QTimer(NULL);
  10. connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
  11. timer->start(1000);
  12. this->exec();
  13. }
  14. //这种方式还是相当于在主线程里面执行
  15. void MyThread::onTimeout()
  16. {
  17. qDebug()<<tr("mythread QThread::currentThreadId()==")<<QThread::currentThreadId();
  18. qDebug()<<"globalCount: " << ++globalCount;
  19. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,403人围观)

还没有评论,来说两句吧...

相关阅读

    相关 QtQt线技术

    Qt提供了许多用于处理线程的类和函数。 Qt程序员可以使用以下四种不同的方法来实现多线程应用程序。 QThread:具有可选事件循环的低级API `QThread`是Q

    相关 Qt线

    今天学习Qt的多线程,在学习多线程主要是两个方面。一是多线程的基础概念,二是多线程的同步,三是怎么和主线程进行通讯。 三.Qt 的应用程序开始执行的时候,只有一个主线程在运行

    相关 QT线

    QT多线程,QT4.7之前是承继 QThread 的方式,比较简单,而 QT5之后,使用了信号和槽的方式,比较灵活。(版本信息可能有误) 下面是对QT线程信息的注意事项

    相关 线创建

    多任务可以由多进程完成,也可以由一个进程内的多线程完成 进程是由若干线程组成的,一个进程至少有一个线程 启动一个线程就是把一个函数传入并创建`Thread`实例,然后调用`