我在尝试执行以下程序时遇到了一个奇怪的问题
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;
}
Run Code Online (Sandbox Code Playgroud)
将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;
}
Run Code Online (Sandbox Code Playgroud)
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;
};
Run Code Online (Sandbox Code Playgroud)
当我尝试执行程序时,没有调用插槽?如果我把moveToThraed(),那么代码将工作,但这不会为我的puprose服务.我错过了什么?
您没有启动主事件循环.
你的主要功能应该是这样的:
QApplication app(argc, argv);
A a;
a.callA();
return app.exec();
Run Code Online (Sandbox Code Playgroud)
如果接收线程中没有运行事件循环,Qt排队连接将无法工作.
当接收器对象存在于发出信号的线程以外的线程中时,Qt::AutoConnection使用a Qt::QueuedConnection,请参阅docs.
A Qt::QueuedConnection通过将事件发布到目标线程的事件循环(接收器所在的线程QObject)来工作.当处理该事件时(通过事件循环),在目标线程中调用对槽的调用.
在您的情况下,主线程总是卡在:
while(1)
sleep(1);
Run Code Online (Sandbox Code Playgroud)
因此,它永远无法执行任何其他操作.