QT多线程异步编程


文章内容来源:http://beijingqt.pbottle.cn

------------------------------

golang 要想开个线程,直接 一个go 命令,node 异步多线程是function天生默认的


多线程异步在某些领域是非常常用的




Qt有两种多线程的方法,其中一种是继承QThread的run函数,


另外一种是把一个继承于QObject的类用moveToThread函数转移到一个Thread里。 


Qt4.8之前都是使用继承QThread的run这种方法,但是Qt4.8之后,Qt官方建议使用第二种方法。






下面记录一下moveToThread()的简单用法,防止遗忘:


1:定义一个继承于QObject的类A


2:然后用这个类的一个实例a调用moveToThread(),将QThread的一个实例thread的指针传进moveToThread()


     a.moveToThread(&thread);


3:然后启动线程,thread.start()


4:把要处理的事务放在process函数中,再利用connect,线程一启动的话就会运行process函数


     connect(&thread, &QThread::started, &a, &A::process);










再粘贴个demo供参考:


QThread* thread = new QThread( );


 Task* task = new Task();




 // move the task object to the thread BEFORE connecting any signal/slots


 task->moveToThread(thread);




 connect(thread, SIGNAL(started()), task, SLOT(doWork()));


 connect(task, SIGNAL(workFinished()), thread, SLOT(quit()));




 // automatically delete thread and task object when work is done:


 connect(task, SIGNAL(workFinished()), task, SLOT(deleteLater()));


 connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));




 thread->start();


-------------------------------------------------------------------------------------------------


class Task : public QObject


{


Q_OBJECT


public:


    Task();


    ~Task();


public slots:


    // doWork must emit workFinished when it is done.


    void doWork();


signals:


    void workFinished();


};






-------------


老式进程内往往用msleep制作循环的间隔也是非常不好的,因为sleep前后有资源消耗的时间,导致sleep的时间实际上并不准确的。


老式进程内只有run() 方法再新线程中运行,而moveToThread 是全部都在新线程中运行。


  • 导航
  • 联系