我在尝试执行以下程序时面临一个奇怪的问题
main.cpp
#include "sample.h"
#include <QList>
#include <unistd.h>
int main(int argc, char **argv)
{
A a;
a.callA();
while(1)
sleep(1);
return 0;
}
sample.cpp的
#include "sample.h"
#include <QList>
#include <QMetaMethod>
#include <unistd.h>
Thread::Thread(A *a)
{
}
void Thread::run()
{
int i = 5;
while (i){
qDebug()<< i;
sleep(2);
i--;
}
emit processingDone(">>> FROM THREAD");
qDebug()<<"Emited signal from thread";
}
void A::callA()
{
qDebug()<<"from callA";
//moveToThread(thread);
thread->start();
//thread->run();
//emit signalA(">>> FROM CallA");
}
void A::slotA(QString arg)
{
qDebug()<<"from sloatA "<< arg;
}
sample.h
class A;
class Thread : public QThread
{
Q_OBJECT
public:
Thread(A *a);
~Thread(){
qDebug()<<"Thread is destroyed";
}
void run();
signals:
void processingDone(QString arg);
};
class A : public QObject{
Q_OBJECT
public:
A(){
qDebug()<<"Registering";
thread = new Thread(this);
connect(thread, SIGNAL(processingDone(QString)), this, SLOT(slotA(QString)));
connect(this,SIGNAL(signalA(QString)), this, SLOT(slotA(QString)));
}
public slots:
void callA();
void slotA(QString arg);
signals:
void signalA(QString arg);
private:
Thread *thread;
};
当我尝试执行程序时,没有调用插槽? 如果我把moveToThraed(),那么代码将工作,但这不会为我的puprose服务。我缺少什么?
答案 0 :(得分:8)
您没有开始主赛事循环。
你的主要功能应该是这样的:
QApplication app(argc, argv);
A a;
a.callA();
return app.exec();
如果接收线程中没有运行事件循环,Qt排队连接就无法正常工作。
当接收器对象位于发出信号的线程以外的线程中时,Qt::AutoConnection
使用Qt::QueuedConnection
,请参阅docs。
Qt::QueuedConnection
通过将事件发布到目标线程的事件循环(接收器QObject
所在的线程)来工作。当处理该事件时(通过事件循环),在目标线程中调用对插槽的调用。
在您的情况下,主线程总是卡在:
while(1)
sleep(1);
所以,它永远无法执行其他任何事情。
答案 1 :(得分:0)
像@Mike所说,你需要启动QT的主事件循环。每个QT应用程序都有它的主要内容:
QApplication a(argc, argv);
return a.exec();
在你的情况下:
int main(int argc, char **argv)
{
QApplication app(argc, argv);
A a;
a.callA();
return app.exec();
}