Qt QCoreApplication:processEvents()可能会引起递归,导致栈溢出崩溃


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 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM