1.继承 QThread
这个类中只有run方法运行在其他线程,和java中的Thread相似,同样start
函数即启动线程重复调用start函数只会执行一次
但要注意一点和Java不同的是内存管理,Java会自动回收内存,不要手动delete对象
wait()子线程等待主线程结束才能继续执行,让其判断一个条件后自动停止线程
在new线程时,不指定父对象,通过绑定**void QObject::deleteLater () [slot]**槽让它自动释放。这样在widget析构时可以免去wait()这句。
connect(thread,&QThread::finished,thread,&QObject::deleteLater); //线程结束后调用deleteLater来销毁分配的内存
2.继承QObject
写一个继承QObject的类,对需要进行复杂耗时逻辑的入口函数声明为槽函数
此类在旧线程new出来,不能给它设置任何父对象
同时声明一个QThread对象,在官方例子里,QThread并没有new出来,这样在析构时就需要调用QThread::wait(),如果是堆分配的话, 可以通过deleteLater来让线程自杀
把obj通过moveToThread方法转移到新线程中,此时object已经是在线程中了
把线程的finished信号和object的deleteLater槽连接,这个信号槽必须连接,否则会内存泄漏
正常连接其他信号和槽(在连接信号槽之前调用moveToThread,不需要处理connect的第五个参数,因为默认不在同一线程中就使用Qt::QueuedConnection,否则就显示声明用Qt::QueuedConnection来连接)
初始化完后调用QThread::start()来启动线程
在逻辑结束后,调用QThread::quit退出线程的事件循环