关于Qt的信号和槽函数执行问题探究

关于Qt的信号和槽函数执行问题探究

疑问:假设一个函数里面创建了多个线程,线程里面做的任务可能很简单,很快就执行完成,线程的finished()信号和另外一个槽函数绑定。问题就是创建线程的那个函数执行完成之前会调用和finished绑定的那个槽函数吗?

直接上代码验证:
classA.h

#pragma once

#include <QObject>
#include <QThread>
#include <QVector>
#include <QMutex>

class ThreadA;

class classA :public QObject {
    Q_OBJECT
public:
    classA(QObject* parent = NULL);
    ~classA();
public:
    void startRun();
private slots:
    void slotFinished();
private:
    QVector<ThreadA*> _vThread;
};

class ThreadA:public QThread
{
    Q_OBJECT
public:
    ThreadA(QObject* parent = NULL);
    ~ThreadA();
    void setMutex(QMutex* m);
protected:
    virtual void run();
private:
    static int i;
    QMutex* mutex;
};

classA.cpp

#include "classA.h"
#include <QDebug>

classA::classA(QObject* parent):QObject(parent)
{
}

classA::~classA()
{

}

void classA::startRun()
{
    QMutex* mutex = new QMutex();
    for (int i = 0; i < 100; i++)
    {
        ThreadA* threadA = new ThreadA();
        threadA->setMutex(mutex);
        connect(threadA, SIGNAL(finished()), this, SLOT(slotFinished()));
        _vThread.push_back(threadA);
        threadA->start();
        QThread::msleep(200);
    }
    qDebug() << "startRun end";
}

void classA::slotFinished()
{
    qDebug() << "slot finished";
}

ThreadA::ThreadA(QObject* parent) :QThread(parent)
{
}

ThreadA::~ThreadA()
{
}

void ThreadA::setMutex(QMutex* m)
{
    mutex = m;
}

void ThreadA::run()
{
    mutex->lock();
    QThread::msleep(100);
    i++;
    qDebug() << i;
    qDebug() << "thread run";
    mutex->unlock();
}

int ThreadA::i = 0;

执行结果:
运行结果图

根据运行结果可以看出:创建线程的那个函数执行完成之后才会调用和finished绑定的槽函数,这也说明了主线程是一个单线程,函数是顺序执行的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值