C++ 如何在Qt中向另一个线程中的插槽发送信号
我已经用Qt编写了一个简单的信号槽应用程序。我想向另一个线程发送一个信号,该线程已用完主线程 这是我的密码:C++ 如何在Qt中向另一个线程中的插槽发送信号,c++,multithreading,qt,signals-slots,qthread,C++,Multithreading,Qt,Signals Slots,Qthread,我已经用Qt编写了一个简单的信号槽应用程序。我想向另一个线程发送一个信号,该线程已用完主线程 这是我的密码: class Thread1 : public QThread { Q_OBJECT void run() { exec(); } public: Thread1(QObject* parent); public slots: void a() { qInfo()<<QThread::
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();
};
如何调用输出另一个threadID的信号?实现
Thread1
构造函数,如下所示:
Thread1(QObject* parent) { moveToThread(this); }
执行
Thread1
构造函数,如下所示:
Thread1(QObject* parent) { moveToThread(this); }
你把它倒过来了。
QThread
是线程句柄,而不是线程本身。如果您想在另一个线程中运行某些内容,它属于移动到线程的普通QObject
。您根本不需要从QThread
派生!您也不应该将QThread
的基QObject
移动到线程本身。您要做的是在线程本身中有一个线程的句柄。一旦线程完成,句柄就变得不起作用(带有nullthread()
的QObject
)
首先,如果您只需要在工作线程中运行一些运行到完成的代码(例如进行计算),请使用线程池和QtConcurrent
框架。它为您管理所有线程:
#include <QtConcurrent>
...
QThread::currentThread()->setObjectName("main");
qDebug() << QThread::currentThread();
QtConcurrent::run([]{ qDebug() << QThread::currentThread(); }
#包括
...
QThread::currentThread()->setObjectName(“main”);
qDebug()你已经把它倒过来了。QThread
是线程句柄,而不是线程本身。如果您想在另一个线程中运行某些内容,它属于移动到线程的普通QObject
。您根本不需要从QThread
派生!您也不应该将QThread
的基QObject
移动到线程本身。您要做的是在线程本身中有一个线程的句柄。一旦线程完成,句柄就变得不起作用(带有nullthread()
的QObject
)
首先,如果您只需要在工作线程中运行一些运行到完成的代码(例如进行计算),请使用线程池和QtConcurrent
框架。它为您管理所有线程:
#include <QtConcurrent>
...
QThread::currentThread()->setObjectName("main");
qDebug() << QThread::currentThread();
QtConcurrent::run([]{ qDebug() << QThread::currentThread(); }
#包括
...
QThread::currentThread()->setObjectName(“main”);
是的,就是他干的。但是它需要删除父对象。为什么需要删除父对象?打印出来的是,对于具有父对象的对象,不能调用moveToThread。不需要删除父对象,只需要删除父子关系。从文档中可以看出:“必须始终在创建父线程的线程中创建QObject的子线程。这意味着,除其他外,您不应将QThread对象(This)作为在线程中创建的对象的父线程进行传递(因为QThread对象本身是在另一个线程中创建的)。”请参阅:This works,但是这是一个坏主意,因为QThread
是一个线程句柄。从概念上讲,在受控资源中拥有一个资源句柄是向后的。是的,就是这样做的。但是它需要删除父对象。为什么需要删除父对象?打印出来的是,对于具有父对象的对象,不能调用moveToThread。不需要删除父对象,只需要删除父子关系。从文档中可以看出:“必须始终在创建父线程的线程中创建QObject的子线程。这意味着,除其他外,您不应将QThread对象(This)作为在线程中创建的对象的父线程进行传递(因为QThread对象本身是在另一个线程中创建的)。”请参阅:This works,但是这是一个坏主意,因为QThread
是一个线程句柄。从概念上讲,在受控资源中拥有一个资源句柄是向后的代码>,它被移动到第三个线程,并且还连接到aSignal
。然后,发出信号将在workerB和c中运行方法aSlot,每一个都在各自的线程中。对吗?@lanoxx正确。如果我有一个工作者c代码>,它被移动到第三个线程,并且还连接到aSignal
。然后,发出信号将在workerB和c中运行方法aSlot,每一个都在各自的线程中。对吗?@lanoxx正确。