文章目录
1 继承QThread重写run()函数
1.1 实现方法
默认情况下,void run() 只执行一次,想要执行多次,要手动使用循环语句。
class myThread : public QThread
{
Q_OBJECT
public:
virtual void run() override;
}
重写run():
void myThread::run()
{
...
}
- 调用 thread.start()启动线程,会自动调用run函数;
- 调用 thread.isRunning()判断线程是否已启动;
- 调用 thread.terminate()或 thread.quit()终止线程;
- 调用 thread.wait()等待线程终止;
- delete thread; thread = nullptr; 置空指针。
class WorkerThread : public QThread
{
Q_OBJECT
void run() override {
/* ... here is the expensive or blocking operation ... */
}
};
void MyObject::startWorkInAThread()
{
WorkerThread *workerThread = new WorkerThread(this);
connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
workerThread->start();
}
1.2 线程结束注意事项
通过连接槽的方式,利用Qt::DirectConnection实现多线程:
QThread myThread =new QThread();
connect(myThread, &QThread::started, this, &TestThread::runEx, Qt::DirectConnection);
connect(this,&TestThread::finished, myThread, &QThread::quit);
在runEx函数末,使用emit finished()发出线程结束信号,即可调用quit来“尝试”结束myThread线程。但是如果在主线程中调用myThread->isRunning()的死循环来判断当前线程是否结束,得到的结果始终都是true。此时如果贸然使用delete来释放线程,会让程序崩溃。并且用isFinished来判断是否结束,但是isFinished一直都是false。换句话说,quit()根本就没有让myThread结束掉。
一种方法是在“主线程”调用terminate()主动的结束子线程:
注意:在线程的run()函数运行结束后,线程结束了,但是并没有被释放,也不会触发Finished信号。要么在run()函数末尾加上emit finished; 或者调用thread->quit(),才能触发Finished信号。
emit finished();
myThread->terminate();
即可正确结束线程,调用delete也不会让程序崩溃了。
2 继承QObject调用moveToThread()函数
2.1 实现方法
class Test : public QObject
{
Q_OBJECT
public:
void test();
}
将QObject对象加载到线程上:
QThread th;
Test test;
test.moveToThread(&th);
<