Qt 多线程之MoveToThread()

            本文粗略整理一下关于Qt 多线程中MoveToThread()的用法,以便回顾。    

  Qt中想实现多线程技术是很方便的,只需要子类化QThread且重新实现它的run()即可。可参阅《C++ GUI Qt4编程》第二版的第十四章。

   MoveToThread()也能用于实现多线程,见代码:

#include "DBMoveToThread.h"
#include <QThread>
DBMoveToThread::DBMoveToThread(QObject *parent) :
    QObject(parent)
{   
   DBThread *thread = new DBThread;
   this->moveToThread(thread);
   thread->start();
}

void DBMoveToThread::callWork()
{
    qDebug()<<"callWork  :  "<<QThread::currentThread();
}

void DBMoveToThread::slotWork1()
{
    qDebug()<<"slotWork1 : "<<QThread::currentThread();
}

void DBMoveToThread::slotWork2()
{
    qDebug()<<"slotWork2 : "<<QThread::currentThread();
}

void DBMoveToThread::slotWork3()
{
    qDebug()<<"slotWork3 : "<<QThread::currentThread();
}

定义了一个继承自QObject的类:DBMoveToThread,子类化QThread类,然后将DBMoveToThread对象(this)丢进thread中,thread->start();语句就是开启一个线程,相当于《C++ GUI Qt4编程》中说的run()函数。这样之后,DBMoveToThread对象中的槽函数就会在非GUI线程中运行。

此处生成了3个对象:

work(用于调用callwork()函数,预计在GUI线程中运行)

work12(调用槽函数:slotwork1(),slotwork2(),预计在同一个线程中运行)

work3(调用槽函数:slotwork3(),预计在另外一个线程中运行) 

调用slot函数的代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    work   = new DBMoveToThread;

    work12 = new DBMoveToThread;

    work3  = new DBMoveToThread;

    connect(ui->callButton,SIGNAL(clicked()),this,SLOT(maincall()));
    connect(ui->slot1Button,SIGNAL(clicked()),work12,SLOT(slotWork1()),Qt::QueuedConnection);
    connect(ui->slot2Button,SIGNAL(clicked()),work12,SLOT(slotWork2()),Qt::QueuedConnection);
    connect(ui->slot3Button,SIGNAL(clicked()),work3,SLOT(slotWork3()),Qt::QueuedConnection);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::maincall()
{
    work->callWork();
}


class DBThread是个空架子,主要是希望这个类能实现多线程:继承自QThread,.h代码如下:

#ifndef DBTHREAD_H
#define DBTHREAD_H

#include <QThread>

class DBThread : public QThread
{
    Q_OBJECT
public:
    explicit DBThread(QObject *parent = 0);

private:

signals:

public slots:

};

#endif // DBTHREAD_H

程序运行之后观察调试信息,和预计看相符否。
点击按钮 次序call---->slot_1---->slot_2---->slot_3

输出见附图(图上房了,在顶部):

callwork()   直接调用-----------处于GUI线程中

slotwork1,2()是调用的槽函数,对象是work12-------------新的线程中

slotwork3()是调用的槽函数,对象是work3-------------另外一个线程中

 

 



 

 

  • 15
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Qt中的多线程可以使用`QThread`类来实现,而`moveToThread`是一个很常用的函数,用于将一个QObject对象移动到另一个线程中执行。 下面是一个使用`moveToThread`的简单例子: ```cpp #include <QCoreApplication> #include <QThread> #include <QDebug> class Worker : public QObject { Q_OBJECT public: Worker(QObject *parent = nullptr) : QObject(parent) {} public slots: void doWork() { qDebug() << "Worker thread:" << QThread::currentThreadId(); } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Worker worker; QThread thread; worker.moveToThread(&thread); QObject::connect(&thread, &QThread::started, &worker, &Worker::doWork); QObject::connect(&worker, &Worker::destroyed, &thread, &QThread::quit); thread.start(); return a.exec(); } ``` 在上面的例子中,我们创建了一个`Worker`类,它继承自`QObject`类,并有一个`doWork`槽函数。我们将`worker`对象通过`moveToThread`函数移动到了`thread`线程中。然后,我们通过`connect`函数将`thread`的`started`信号连接到`worker`的`doWork`槽函数上,当线程启动时,`doWork`槽函数会在`thread`线程中执行。同时,我们还将`worker`的`destroyed`信号连接到`thread`的`quit`槽函数上,以保证线程能够正确退出。 需要注意的是,如果我们将一个QObject对象移动到了另一个线程中执行,那么它的所有信号和槽函数都必须在该线程中执行,否则会出现问题。所以,在上面的例子中,我们将`worker`对象的`doWork`槽函数定义为`public slots`,并且在`thread`线程中执行,以保证它能正确执行。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值