亚洲欧美日韩国产综合_日韩少妇一级特爱_黄频免费_日本不卡一区视频自拍偷拍视频 - 无码野战在线看国产

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 是全部都在新線程中運行。


  • 導航
  • 聯系