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();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM