QThread的用法

  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();
 
原文地址:https://www.cnblogs.com/mathyk/p/9491816.html