2011-12-16 41 views
0

下面的代码会崩溃,甚至挂起linux,有关它的任何想法?为什么应用程序崩溃,如果eventlist中有太多事件?

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

哦,男孩......不......真的不要做moveToThread(this)!这是真的错了http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/ – 2011-12-16 10:27:57

回答

2

它崩溃,因为这一点:

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

Qt的信号队列不断增长,但你是不是让Qt的处理信号,因此它会继续下去,直到它崩溃。使用QTimer避免冻结您的应用程序并让Qt处理您的信号。

相关问题