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 }