PDA

View Full Version : Can't receive signal from another thread.



useryy
14th December 2011, 06:38
Can't receive signal from another thread as following.
Using connect type as Qt::BlockingQueuedConnection, the thread blocks. But signal not received.

main.cpp


#include "myclass.h"




int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);


MyClass myClass;
myClass.startAll();

return a.exec();
}


thread.h


#include <QtCore/QCoreApplication>
#include <QThread>

#include <QDebug>



class Thread1 : public QThread
{
Q_OBJECT
public:
void run( void )
{
qDebug() << "thread 1 started";
int i = 0;
while(1)
{
msleep( 10 );
i++;
qDebug() << "i is: " + QString::number(i);
if(i==1000)
{
qDebug() << "Got I";
emit MyThread1Signal();
exit();
}
}
}
signals:
void MyThread1Signal();
};





myclass.cpp


MyClass::MyClass(QObject *parent) :
QObject(parent)
{
thread1 = new Thread1();
connect(thread1, SIGNAL(MyThread1Signal()), this, SLOT(myClassSlot1()), Qt::BlockingQueuedConnection);
}


void MyClass::startAll()
{
thread1->start();
thread1->wait();
}


void MyClass::myClassSlot1()
{
qDebug()<<"Signal received";
}


myclass.h


#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>

#include "threads.h"

class MyClass : public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = 0);

void startAll();

signals:

public slots:
void myClassSlot1();

private:
Thread1* thread1;
};

#endif // MYCLASS_H

Lesiok
14th December 2011, 07:25
Because You never launch main event loop. Why wait for the end of the second thread in the method MyClass::startAll calling thread1->wait() ?

useryy
14th December 2011, 07:37
Hi,

For It needs not receive any event in thread, so I don't think exec() is required.


Remove wait(), it is ok. It's this wait() that makes the thread never give up execution. Right?

Please correct me if my understanding is wrong.

Lesiok
14th December 2011, 12:41
Yes, a problem is wait(). But I'm talking about main exec. You have a connection with attribute Qt::BlockingQueuedConnection. This means that the event is delivered through the recipient's message queue thread. This is not the same as Qt:: DirectConnection.