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