1

次のコードはクラッシュし、Linuxをハングさせることさえありますが、それについて何かアイデアはありますか?

#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();
}
4

1 に答える 1

3

これが原因でクラッシュします:

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

Qtシグナルキューは増え続けますが、Qtにシグナルを処理させていないため、クラッシュするまで継続します。QTimerを使用して、アプリケーションのフリーズを回避し、Qtに信号を処理させます。

于 2011-12-16T09:59:11.963 に答える