qt 子窗口写到线程就卡死_Qt线程-官方推荐的写法

b5da3baa51b04f04043a874144a2b4d6.png

d227a0cce086781734f4119a6badb5f2.gif

直接重写QThread是没有问题的,但是重写QThread这种方式不太灵活,对于重写的Thread来讲,只有run函数才会在新的线程中。对于重写的QThread是可以带出来对应的数据得,但是自己响应自己的槽函数的话,就不太灵活了,Qt的老版本代码中甚至写了这样的代码。

WorkerThread(QObject *parent = 0)
        : QThread(parent)
    {
           moveToThread(this);
    }

这种写法是非常不清真的。包括Qt的QThread介绍中,都不推荐这样写了。 今天给大家介绍新的实现方式,这种实现方式相当灵活,可以任意的启动,暂停之类的操作,都是通过Qt的信号槽来实现。我们先继续实现上一个例子。这次使用新的实现方式。

重写QObject,move到新的线程中。

这样是QObject自己的消息循环放到了新的线程中,跨线程之间信号槽就随随便便的使用了。

上代码

class WorkThread : public QObject
{
    Q_OBJECT
public:
    WorkThread(QObject* parent = nullptr);
    ~WorkThread();
public slots:
    void start1();
    void doWork();
signals:
    void workFinished();
    void workStart();
};

//cpp
WorkThread::WorkThread(QObject* parent) : QObject (parent)
{
}
WorkThread::~WorkThread()
{
}
void WorkThread::start1()
{
    emit workStart();
    doWork();
}
void WorkThread::doWork()
{
    for (int i = 0; i < 1000; i++)
    {
        qDebug()<<i<<endl;
    }
    emit workFinished();
}

然后上逻辑代码

    m_workerThread = new QThread();
    WorkThread* worker = new WorkThread();
    worker->moveToThread(m_workerThread);

    //开始线程
    connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::ThreadStart);
    connect(m_workerThread, &QThread::started, worker, &WorkThread::start1);

    //销毁线程
    connect(worker, &WorkThread::workFinished, worker, &WorkThread::deleteLater);
    connect(worker, &WorkThread::destroyed, m_workerThread, &QThread::quit);
    connect(m_workerThread, &QThread::finished, m_workerThread, &QThread::deleteLater);

直接看connect,一个个解释

  1. connect绑定按钮,点击线程启动
  2. 线程启动,Object中的work函数开始工作,输出1-1000
  3. Object输出结束,自己销毁自己
  4. 创建的线程看到Object销毁,先自己退出
  5. 线程自己结束,然后自己删除自己

完美释放了QThread的资源。

当然有人问你这样的操作太复杂了,没必要。其实对于简单的逻辑来讲,这样确实没必要。但是对于颗粒度控制来讲,这种更有优势,下一篇。我会针对这个代码通过信号槽做一些控制的操作。

https://github.com/CryFeiFei/Qt_Teach/tree/master/Qt_Teach/Thread2[1]

参考资料

[1]

https://github.com/CryFeiFei/Qt_Teach/tree/master/Qt_Teach/Thread2: https://github.com/CryFeiFei/Qt_Teach/tree/master/Qt_Teach/Thread2

欢迎关注我的公众号:Qt那些事儿

d227a0cce086781734f4119a6badb5f2.gif
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值