QT线程
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
3thread->start();
emit startThread();
connect(this,&myWidget::startThread,myT,&myObject::myTimeout)
关闭线程:1
2thread.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