2011-12-12 74 views
-1
struct C : public QObject 
{ 
    Q_OBJECT 

public: 

    C() 
    { 
     qDebug()<<"C()"; 

     //connect(this,SIGNAL(cs()),this,SLOT(cl2()),Qt::QueuedConnection); 
    } 

    ~C(){qDebug()<<"~C()";} 

signals: 

    void cs(); 

public slots: 

    void cl() 
    { 
     //it seems this signal will be emited only when the following loop finished 
     //the output is : 
     // cl2 ......... cl2 obj ..........obj 
     // which means that the sub-thread not work simultaneously with the main thread 
     // but if i move the bold line to cl2 function and add 
     // connect(this,SIGNAL(cs()),this,SLOT(cl2()),Qt::QueuedConnection); to constructor 
     // its output will be: 
     // cl2 ... cl2 ..obj ..obj... cl2...obj...... 
     // which mean that main thread and sub-thread work concurrently. 
     // any idea about it? 

     emit cs(); 
     for (int i=0;i<=1000000;++i) 
      qDebug()<<"cl2"; 
    } 

    void cl2() 
    { 
     //for (int i=0;i<=1000000;++i) 
     // qDebug()<<"cl2"; 
    } 
}; 

struct Obj : public QObject 
{ 
    Q_OBJECT 

public: 

    Obj(){qDebug()<<"Obj()";} 

    ~Obj(){qDebug()<<"~Obj()";} 

public slots: 

    void ol() 
    { 
     for (int i=0;i<=10000000;++i) 
      qDebug()<<"Obj"; 
    } 
}; 

int main(int argc,char* argv[]) 
{ 
     QApplication app(argc, argv); 

     QThread th; 

     C * c=new C; 

     Obj *o=new Obj; 

     c->moveToThread(&th); 

     th.start(); 

     QObject::connect(c,SIGNAL(cs()),o,SLOT(ol()),Qt::QueuedConnection); 

     c->cl(); 

     QTimer::singleShot(300,&app,SLOT(quit())); 

     app.exec(); 
} 
+0

问题是? –

回答

0

这两种方法都在主线程中执行: cl()在主线程中执行,因为它是从主线程中调用,ol()在主线程由于o主执行线程& & QueuedConnection

当您将代码更改为版本时,该代码已被注释,执行cl2()将移至th线程。