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