QT多线程异步编程

上位机软件 2023-03-10 18:00:11

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

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


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

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

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



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

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

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

     a.moveToThread(&thread);

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

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

     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();

};



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

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

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

咨询小瓶科技
咨询我们
顶部