Qt学习之系列[9] – QCoreApplication:processEvents()可能会引起递归,导致栈溢出崩溃

Posted maxiongying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt学习之系列[9] – QCoreApplication:processEvents()可能会引起递归,导致栈溢出崩溃相关的知识,希望对你有一定的参考价值。

api含义:QCoreApplication::processEvents() 将处理所有事件队列中的事件并返回给调用者。

问题描述:

当主线程在某个槽函数里正在执行processEvents时, 刚好有一个能响应此槽函数的信号发送过来了(肯定是其他线程发的信号),  这时就可能会发生可怕的递归, 

导致栈溢出崩溃。 原因是processEvents,进入到无尽的递归中。

示例代码

bugThread.h

#include <QThread>
class BugThread : public QThread
{
	Q_OBJECT
public:
	BugThread(QObject* parent) : QThread(parent) {}
signals:
	void sigBugsignal();
public:
	void run() 
	{
		while(true)
		{
			emit sigBugsignal();
		}
	}
};

bugs.h & bugs.cpp

class Bugs : public QMainWindow
{
	Q_OBJECT

public:
	Bugs(QWidget *parent = 0, Qt::WFlags flags = 0);
	~Bugs();
	public slots:
		void onBugSlot();
private:
	Ui::BugsClass ui;
};


Bugs::Bugs(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);
	BugThread* bt = new BugThread(this);
	connect(bt, SIGNAL(sigBugsignal()), this, SLOT(onBugSlot()));
	bt->start();
}

Bugs::~Bugs()
{

}
void Bugs::onBugSlot()
{
	Sleep(1); 
	QApplication::processEvents();
}

以上是关于Qt学习之系列[9] – QCoreApplication:processEvents()可能会引起递归,导致栈溢出崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Qt学习之QListWidget删除Item

Qt源码学习之信号槽

QT学习之QMainWindow详解

QT学习之信号和槽

Qt学习之QDataStream

Qt学习之QListWidget删除Item