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
在主线程中执行&amp;&amp; QueuedConnection
。
当您将代码更改为版本时(注释),cl2()
的执行将移至th
线程。