golang 要想開個線程,直接 一個go 命令,node 異步多線程是function天生默認(rèn)的
多線程異步在某些領(lǐng)域是非常常用的
Qt有兩種多線程的方法,其中一種是繼承QThread的run函數(shù),
另外一種是把一個繼承于QObject的類用moveToThread函數(shù)轉(zhuǎn)移到一個Thread里。
Qt4.8之前都是使用繼承QThread的run這種方法,但是Qt4.8之后,Qt官方建議使用moveToThread第二種方法。
下面記錄一下moveToThread()的簡單用法,防止遺忘:
1:定義一個繼承于QObject的類A
2:然后用這個類的一個實例a調(diào)用moveToThread(),將QThread的一個實例thread的指針傳進(jìn)moveToThread()
a.moveToThread(&thread);
3:然后啟動線程,thread.start()
4:把要處理的事務(wù)放在doWork函數(shù)中,再利用connect,線程一啟動的話就會運行doWork函數(shù)
connect(&thread, &QThread::started, &a, &A::doWork);
再粘貼個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();
};
-------------
老式進(jìn)程內(nèi)往往用msleep制作循環(huán)的間隔也是非常不好的,因為sleep前后有資源消耗的時間,導(dǎo)致sleep的時間實際上并不準(zhǔn)確的。
老式進(jìn)程內(nèi)只有run() 方法再新線程中運行,而moveToThread 是全部都在新線程中運行。
--------------------
原文地址:https://soft.pbottle.com/a-13513.html