关于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绑定的槽函数,这也说明了主线程是一个单线程,函数是顺序执行的。