如何在Qt中通知另一个线程中的插槽
How to signal a slot in another thread in Qt
我用Qt写了一个简单的信号槽应用程序,我想发送一个信号给另一个线程,它运行在主线程之外。
下面是我的代码:class Thread1 : public QThread
{
Q_OBJECT
void run()
{
exec();
}
public:
Thread1(QObject* parent);
public slots:
void a()
{
qInfo()<<QThread::currentThreadId();
}
};
class Object : public QObject
{
Q_OBJECT
public:
Object(){}
void start()
{
qInfo()<<QThread::currentThreadId();
Thread1* thread = new Thread1(this);
connect(this,SIGNAL(a()),thread,SLOT(a()));
thread->start();
emit a();
}
signals:
void a();
};
但是它返回:
0x7f9851c988c0
0x7f9851c988c0
如何调用输出另一个threadID的信号?
你搞反了。QThread
是一个线程句柄,而不是线程本身。如果您想在另一个线程中运行某些东西,它属于您移动到线程的普通QObject
。你根本不需要从QThread
中推导!您也不应该将QThread
的基础QObject
移动到线程本身。你所做的就是在线程本身中有一个线程的句柄。一旦线程完成,句柄变为非功能(QObject
与空thread()
)。
首先,如果所有你需要的是运行一些代码,运行到完成(例如做一个计算)在一个工作线程,使用线程池和QtConcurrent
框架。它为你管理所有的线程:
#include <QtConcurrent>
...
QThread::currentThread()->setObjectName("main");
qDebug() << QThread::currentThread();
QtConcurrent::run([]{ qDebug() << QThread::currentThread(); }
如果你坚持自己控制线程的生命周期,你可以这样做:
#include <QtCore>
struct Worker : QObject {
Q_SLOT void aSlot() {
qDebug() << QThread::currentThread();
QThread::currentThread()->quit();
}
Q_SIGNAL void aSignal();
Q_OBJECT
};
int main(int argc, char ** argv) {
QCoreApplication app{argc, argv};
QThread::currentThread()->setObjectName("main");
QThread thread;
thread.setObjectName("thread");
Worker a, b;
b.moveToThread(&thread);
thread.start();
QObject::connect(&a, &Worker::aSignal, &b, &Worker::aSlot);
emit a.aSignal(); // the signal is emitted from the main thread
thread.wait();
}
最后,注意QDebug
类知道如何在传递指向QObject
的指针时输出对象的地址、类和名称(如果设置了)。因此,您不需要使用QThread::currentThreadId()
, QThread::currentThread()
就足够了—您可以为线程提供助记名称,因为它们毕竟是QObject
。
按如下方式实现Thread1
构造函数:
Thread1(QObject* parent) { moveToThread(this); }
相关文章:
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- boost信号和插槽在不同的线程中不工作(使用boost::asio::io_service)
- Qt5 跨线程信号和插槽
- 信号/插槽多线程 Qt
- Qt-使用信号和具有不同线程的插槽
- 一个类中的QT信号/插槽,但从不同的线程发出
- 我有 12 个 CPU,1 个插槽,每个插槽 6 个内核,每个内核 2 个线程 - 这些信息如何对应于 MPI 和 Op
- 从第二个线程调用Qt信号有效 - >对连接的插槽没有影响
- 为什么即使在使用 Qt::D irectConnection 之后,接收器的线程中仍会调用插槽?如何确保在另一个线程中调用它?
- 将工作线程信号与主窗口插槽 (Qt5) 连接时出错
- QT插槽未在多线程DLL中执行
- QT对象::连接:没有此类插槽信号到线程插槽
- 如何将信号从线程连接到插槽
- 交叉线程信号插槽,如何发送字符*
- worker是否可以在Qt中使用信号/插槽连接停止自己的线程?
- 如何在 Windows 上的线程退出时释放 TLS 插槽中的对象
- 使用QtConcurrent::run连接单独线程上的信号/插槽
- 将只有插槽的QGLWidget移动到不同的线程
- 事件队列是否与用于跨线程信号/槽(在Qt中)的队列相同?