• 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 }
  • 相关阅读:
    linux系统rewrite重定向及搭建discuz
    nginx客户端请求分类
    linux系统nginx动静分离
    RDB与AOF
    AOF持久化
    redis持久化(RDB)
    redis操作
    redis搭建
    Redis简介
    小技巧从此拒绝$?
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13185874.html
Copyright © 2020-2023  润新知