QThread类和QRunnable类是QT中提供线程操作的类,文章简单介绍两个类的使用方法。
QThread类
使用方法:1.继承QThread类;
自定义一个继承QThread的类MyThread,重载MyThread中的run()函数,在run()函数中写入需要执行的工作。
调用start()函数来启动线程。
2.Qobject::moveToThread()
(1)定义一个继承于QObject的worker类,在worker类中定义一个槽slot函数doWork(),这个函数中定义线程需要做的工作。 (2)在要使用线程的controller类中,新建一个QThread的对象和woker类对象,使用moveToThread()方法将worker对象的事件循环全部交由QThread对象处理。
(3)建立相关的信号函数和槽函数进行连接,然后发出信号触发QThread的槽函数,使其执行工作。
两种方法的区别方法的区别:1.直接继承的方法,只有run函数才会在子线程中运行,即使在run函数中调用自己的其他槽函数,其他槽函数依然是在主线程中运行。这种方法往往是在一直循环的任务中使用,run函数本身操作繁琐复杂,一般情况下不会退出;2.使用moveToThread的方法更加轻便,可以在一个类中添加若干个槽函数,都能在子线程中运行。使用这种方法往往会主动退出。
QRunnable类
使用方法:
1、继承QRunnable。和QThread使用一样,首先需要将你的线程类继承于QRunnable。 2、重写run函数。还是和QThread一样,需要重写run函数,run是一个纯虚函数,必须重写。 3、使用QThreadPool启动线程
总结:
两个类的区别:1、QRunnable没有继承QObject,如果想使用信号与槽需要自己继承QObject;2、启动线程方式不同。QThread线程可以直接调用start()函数启动,而QRunnable线程需要借助QThreadPool进行启动。 3、资源管理不同。QThread线程对象需要手动去管理删除和释放,而QRunnable则会在QThreadPool调用完成后自动释放。