api含义:QCoreApplication::processEvents() 将处理所有事件队列中的事件并返回给调用者。
问题描述:
当主线程在某个槽函数里正在执行processEvents时, 刚好有一个能响应此槽函数的信号发送过来了(肯定是其他线程发的信号), 这时就可能会发生可怕的递归,
导致栈溢出崩溃。 原因是processEvents,进入到无尽的递归中。
示例代码:
1 bugThread.h 2
3 #include <QThread>
4 class BugThread : public QThread 5 { 6 Q_OBJECT 7 public: 8 BugThread(QObject* parent) : QThread(parent) {} 9 signals: 10 void sigBugsignal(); 11 public: 12 void run() 13 { 14 while(true) 15 { 16 emit sigBugsignal(); 17 } 18 } 19 }; 20 bugs.h & bugs.cpp 21
22 class Bugs : public QMainWindow 23 { 24 Q_OBJECT 25
26 public: 27 Bugs(QWidget *parent = 0, Qt::WFlags flags = 0); 28 ~Bugs(); 29 public slots: 30 void onBugSlot(); 31 private: 32 Ui::BugsClass ui; 33 }; 34
35
36 Bugs::Bugs(QWidget *parent, Qt::WFlags flags) 37 : QMainWindow(parent, flags) 38 { 39 ui.setupUi(this); 40 BugThread* bt = new BugThread(this); 41 connect(bt, SIGNAL(sigBugsignal()), this, SLOT(onBugSlot())); 42 bt->start(); 43 } 44
45 Bugs::~Bugs() 46 { 47
48 } 49 void Bugs::onBugSlot() 50 { 51 Sleep(1); 52 QApplication::processEvents(); 53 }