现在的位置: 首页 > 综合 > 正文

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

2014年07月02日 ⁄ 综合 ⁄ 共 882字 ⁄ 字号 评论关闭

api含义:QCoreApplication::processEvents() 人工地强迫事件循环运行。QCoreApplication::processEvents() 将处理所有事件队列中的事件并返回给调用者。

问题描述:

当主线程在某个槽函数里正在执行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();
}

抱歉!评论已关闭.