C++ 带螺纹的Qt信号槽
QThread类中的信号/插槽有问题。我的设计是这样的:C++ 带螺纹的Qt信号槽,c++,multithreading,qt,C++,Multithreading,Qt,QThread类中的信号/插槽有问题。我的设计是这样的: class Manager : public QObject { Q_OBJECT public: Manager(QObject* parent) : QObject(parent) { Thread thread* = new Thread(this); connect(this, SIGNAL(testsignal()), thread, SLOT(test()));
class Manager : public QObject {
Q_OBJECT
public:
Manager(QObject* parent) : QObject(parent) {
Thread thread* = new Thread(this);
connect(this, SIGNAL(testsignal()), thread, SLOT(test()));
thread->start();
...
emit testsignal();
}
signals:
void testsignal();
};
class Thread : public QThread {
Q_OBJECT
public slots:
void test() {
qDebug() << "TEST";
}
private:
void run() {}
};
类管理器:公共QObject{
Q_对象
公众:
经理(QObject*父对象):QObject(父对象){
螺纹*=新螺纹(此);
连接(此、信号(testsignal())、线程、插槽(test());
线程->开始();
...
发射测试信号();
}
信号:
void testsignal();
};
类线程:公共QThread{
Q_对象
公众时段:
无效测试(){
qDebug()问题在于,这会导致将信号排队到目标线程的事件队列(排队连接)中。如果该线程从不处理事件,它将永远无法获得信号
还有:
从此方法返回将结束线程的执行
换句话说,使用空的run
方法会导致线程立即终止,因此您正在向死线程发送信号。发送到QThread对象的信号将发送到父对象的线程。在这种情况下,发送到创建它的同一线程
要使对象位于另一个线程上,应将其移动到该线程:
class Manager : public QObject {
Q_OBJECT
public:
Manager(QObject* parent) : QObject(parent) {
Thread thread* = new QThread(this);
Receiver* rec = new Receiver(); //no parent
connect(this, SIGNAL(testsignal()), rec, SLOT(test()));
connect(thread, SIGNAL(finished()), rec, SLOT(deleteLater()));
rec->moveToThread(thread);
thread->start();
...
emit testsignal();
}
signals:
void testsignal();
};
class Receiver: public QObject {
Q_OBJECT
public slots:
void test() {
qDebug() << "TEST";
}
};
类管理器:公共QObject{
Q_对象
公众:
经理(QObject*父对象):QObject(父对象){
Thread Thread*=新的QThread(此);
Receiver*rec=new Receiver();//无父项
连接(此,信号(testsignal()),rec,插槽(test());
连接(线程、信号(finished()、rec、插槽(deleteLater());
rec->moveToThread(线程);
线程->开始();
...
发射测试信号();
}
信号:
void testsignal();
};
类接收者:公共QObject{
Q_对象
公众时段:
无效测试(){
qDebug()Thread::test()
未定义为插槽。抱歉,这是一个输入错误。Thread-Thread*
另一个输入错误?您的代码现在对我有效。为什么在线程中有一个空的run()
方法?为什么?已经有了一个非常好的run()实现
您只需离开即可。类似地,您不应该从QThread
派生。将您的测试()
插入一个不是线程的QObject
派生类。只是顺便说一句-不要将QThread
子类化;相反,创建一个QThread
,将适当的对象移动到它,然后启动它的事件循环。请参阅Maya Posch获得良好的建议。好的。我在我的运行方法中添加了一个infinte循环:while(true){
没有任何更改。我从未收到信号。@adapto,因为您需要启动事件循环。最简单的方法是调用this->exec()
(或者一开始就不要重新实现run)。谢谢。我尝试了这个方法,但它不起作用。我添加了连接(线程,信号(start()),mFetchTilesThread,SLOT(run());
并将我的run()
方法放入公共槽中
。此方法被正确调用。