Qt中建立线程的主要目的就是为了用线程来处理那些耗时的后台操作,从而让主界面能即使响应用户的请求操作。
方法一 QObject::moveToThread()
1.将执行对象放到线程中
2.建立相关的信号函数和槽函数进项连接,然后发出信号触发QThread的槽函数,使其执行工作。
//线程执行对象
myT = new MyThread();
//创建子线程
thread = new QThread();
//把自定义模块添加到子线程中
myT->moveToThread(thread);
//启动子线程,但是,并没有启动线程处理函数
thread->start();
//线程处理函数必须通过 signal-slot 调用
connect(ui->pushButton,&QPushButton::pressed,myT,&MyThread::drawImage);
connect(this,&Widget::destroyed,this,&Widget::dealClose);
void Widget::dealClose()
{
//退出线程
thread->quit();
//回收资源
thread->wait();
}
方法二 继承QThread类
1.自定义一个继承QThread的类MyThread,重载MyThread中的run()函数,在run()函数中写入需要执行的工作。
2.调用start()函数来启动线程。
class MyThread : public QThread { Q_OBJECT public: MyThread(QObject* parent = nullptr); //自定义发送的信号 signals: void mythread_signal(const int); //自定义槽 public slots: void mythread_slots(const int); protected: void run() override; };
MyThread::MyThread(QObject *parent) { } void MyThread::run() { qDebug()<<"myThread run() start to execute"; qDebug()<<"current thread ID:"<<QThread::currentThreadId()<<' '; //循环一千次 int count = 0; for(int i = 0;i!=1000;++i){ ++count; } //发送结束信号 emit mythread_signal(count); exec(); } void MyThread::mythread_slots(const int val) { qDebug()<<"myThreadSlot() start to execute"; qDebug()<<"current thread ID:"<<QThread::currentThreadId()<<' '; //循环一千次 int count = 2000; for(int i = 0;i!=1000;++i){ ++count; } emit mythread_signal(count); }
pMyThread = new MyThread();
//启动该线程
pMyThread->start();