2011-12-16 9 views
0

次のコードはクラッシュし、さらには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(); 
} 
+2

ああ男の子...本当にやらないでくださいmoveToThread(this)!本当に間違っているhttp://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/ –

答えて

2

これは、このためのクラッシュ:

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

Qtの信号待ち行列は、それがクラッシュするまで、それは行くし続けますので、信号の成長が、あなたはQtのプロセスをさせるされていません保持します。 Qtimerを使用すると、アプリケーションがフリーズしたり、Qtがシグナルを処理したりすることがなくなります。

関連する問題