странное поведение qt emit при использовании qthread - PullRequest
0 голосов
/ 12 декабря 2011
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();
}

1 Ответ

0 голосов
/ 12 декабря 2011

Оба метода выполняются в основном потоке: cl() выполняется в основном потоке, поскольку он вызывается из основного потока, ol() выполняется в основном потоке из-за o в основном потоке && QueuedConnection.

Когда вы изменяете свой код на версию с комментариями, выполнение cl2() перемещается в поток th.

...