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 }

 

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

上一篇:移动端多图片上传


下一篇:vue系列教程-14axios的使用