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

1 回答 1

0

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

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

于 2011-12-12T18:42:54.140 回答