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();
}
Asked
Active
Viewed 220 times
-1

Christian Rau
- 45,360
- 10
- 108
- 185

camino
- 10,085
- 20
- 64
- 115
1 Answers
0
Both methods are executed in main thread:
cl()
is executed in main thread, because it is called from main thread, ol()
is executed in the main thread due to o
in the main thread && QueuedConnection
.
When you change your code to version, that is commented, execution of cl2()
moves to th
thread.

Lol4t0
- 12,444
- 4
- 29
- 65