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 回答