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