Search code examples
qtqthreademit

why application crashed ,if there are too many events in the eventlist?


The following codes will crash ,and even hang the linux, any ideas about it ?

#include <QCoreApplication>
#include <QString>
#include <QMap>
#include <QList>
#include <QDebug>
#include <QThread>
#include <QTest>


long long emited=0;
long long handled=0;
int flag=0;

class A:public QThread
{
    Q_OBJECT
public:
    A(QString n):n_(n){moveToThread(this);}
    void run() {
        QMetaObject::invokeMethod(this, "g",Qt::QueuedConnection);
        exec();
    }
    QString n_;
signals:
    void as();
public slots:
    void g(){
        while(1) {
            ++emited;
            emit as();
        }
    }
};

class Main:public QObject
{
    Q_OBJECT
public slots:
    void s0(){}
    void s1(){
        ++flag;
        ++handled;
        A *obj = qobject_cast<A*>(sender());
        int nothandle=emited-handled;
        --flag;
        if(obj) {
            qDebug()<<"s1"<<obj->n_<<"not handled:"<<nothandle<<flag;
        }
    }
};



int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QThread th1,th2;
    A a1("a1"),a2("a2");
    Main m;
    QObject::connect(&a1,SIGNAL(as()),&m,SLOT(s1()),Qt::QueuedConnection);
    QObject::connect(&a2,SIGNAL(as()),&m,SLOT(s1()),Qt::QueuedConnection);
    a1.start();
    a2.start();
    return a.exec();
}

Solution

  • It crashes because of this:

    while(1) {
        ++emited;
        emit as();
    }
    

    The Qt signal queue keeps growing but you are not letting Qt process the signals, so it will keep on going until it crashes. Use a QTimer to avoid freezing your application and to let Qt process your signals.