使用QThread 创建线程
QObject::moveToThread
-
定义一个继承于QObject的worker类,在worker类中定义一个槽slot函数doWork(),这个函数中定义线程需要做的工作;
class Worker:public QObject //work定义了线程要执行的工作 { Q_OBJECT public: Worker(QObject* parent = nullptr){} public slots: void doWork(int parameter) //doWork定义了线程要执行的操作 { //...... } signals: void resultReady(const int result); //线程完成工作时发送的信号 };
-
在要使用线程的controller类中,新建一个QThread的对象和woker类对象,使用moveToThread()方法将worker对象的事件循环全部交由QThread对象处理;
QThread workerThread; Worker *worker = new Worker; worker->moveToThread(&workerThread);
-
建立相关的信号函数和槽函数进行连接,然后发出信号触发QThread的槽函数,使其执行工作。
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
继承QThread类重写run方法
-
自定义一个继承QThread的类MyThread,重载MyThread中的run()函数,在run()函数中写入需要执行的工作;
class MyThread : public QThread { Q_OBJECT public: MyThread(QObject* parent = nullptr); protected: void run() override; }; void MyThread::run() { for(int i = 0;i!=1000000;++i) { ++count; } }
-
调用start()函数来启动线程。
MyThread* subThread = new MyThread(this); connect(subThread, &MyThread::finished, subThread, [=](){ subThread->deleteLater(); }); subThread->start();
QThreadPool
class HelloWorldTask : public QRunnable
{
void run() override
{
qDebug() << "Hello world from thread" << QThread::currentThread();
}
};
HelloWorldTask *hello = new HelloWorldTask();
QThreadPool::globalInstance()->setMaxThreadCount(4);
QThreadPool::globalInstance()->start(hello);
- 创建任务类:首先,你需要创建一个任务类,这个类应该继承自QRunnable(如果想使用信号槽,可以通过多继承QObject来实现),并且实现一个具有适当参数的run()方法,这个方法将会在线程池中执行。
- 实例化任务对象
- 通过QThreadPool::globalInstance()->start(hello); 添加到线程池