Qt信号槽与线程
Qt signal slot with threads
我在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()));
thread->start();
...
emit testsignal();
}
signals:
void testsignal();
};
class Thread : public QThread {
Q_OBJECT
public slots:
void test() {
qDebug() << "TEST";
}
private:
void run() {}
};
信号从未到达我的test()方法。有人能帮忙吗?谢谢。
问题是跨线程发送信号会导致将信号排队到目标线程的事件队列(排队连接)中。如果该线程从不处理事件,它将永远不会得到信号。
同时,根据QThread::run
文档:
从该方法返回将终止线程的执行。
换句话说,拥有一个空的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";
}
};
相关文章:
- 线程之间的布尔停止信号
- 通过安装信号处理程序关闭多线程应用程序
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 发出信号以从线程更新 UI
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- 从另一个线程发出信号是否安全?
- boost信号和插槽在不同的线程中不工作(使用boost::asio::io_service)
- Qt:向死/停止线程发送信号
- Qt5 跨线程信号和插槽
- Qt5 多线程:信号仅单向工作
- 将工作线程信号与主窗口插槽 (Qt5) 连接时出错
- 通知有关变量变化的线程(信号?)
- 交叉线程信号插槽,如何发送字符*
- 事务中的线程信号
- 休眠 X 毫秒或线程信号
- 多线程信号
- 事件队列是否与用于跨线程信号/槽(在Qt中)的队列相同?
- Xcode 线程信号错误和本地声明错误
- c++11中的父线程信号
- QT小部件插槽调用没有被单独的线程信号激活