QT的线程:引入< QThread > 两种用法:

第一种:
  实例化类:thread = new Thread ;
  启动线程:< QThread >类中带有虚函数run(),把需要线程处理的函数放在run()中重新实现。即在Thread.h与Thread.cpp文件中重写run();
  启动线程: thread->start()打开新的线程,就会自动调用run()函数。
  关闭线程:thread.quit();thread.wait();

第二种:
  该方法更为灵活,方法一将要实现的内容放在run()函数中,这就造成了一定的局限性。新方法将重新定义一个新的class,将该类与实例化的thread绑定(相当于方法一中run()中的内容用新的class重写了),这样启动thread()就会创建新的线程。
  实例化类:thread = new QThread ;(不用创建.h .cpp来重写run()了)
  实例化类:myT = new myObject; 在类文件(.h .cpp)中重写要实现的函数myT->myTimeout()。
  将该类与线程绑定:myT->moveToThread(thread);
  启动线程:

1
2
3
thread->start();
emit startThread();
connect(this,&myWidget::startThread,myT,&myObject::myTimeout)

  关闭线程:
1
2
thread.quit();
thread.wait();


  不过要注意,该方法启动线程:thread->start(),只启动了线程,但没有启动线程处理函数。如果在这之后添加myT->myTimeout();来主动调用线程函数也是不可以的,这样会导致线程函数和主线程在同一线程。
  (用qDebug<< QThread::currentThread();可以查看当前线程号)
  这时需要在Widget构造函数中connect(this,&myWidget::startThread,myT,&myObject::myTimeout)来连接线程函数。
  调用thread.quit();thread.wait();后线程不会立即关闭,而是等待线程函数处理完毕后才会关闭线程。
  connect()函数的第五个参数,是和多线程有关的,默认多线程,槽函数所在线程与接收者一样,即myT与&myObject::myTimeout一个线程。这也解释了方法二为什么要用connect()启动线程函数,因为connect()有主线程,子线程之分,当代码中出现绑定线程的操作:myT->moveToThread(thread),则connect()就会把myT与&myObject::myTimeout放到子线程执行。

[线程详细教学]https://www.bilibili.com/video/BV1XW411x7NU?p=79&vd_source=b6da26061de3320a8170666f06381a91