Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在Qt中向另一个线程中的插槽发送信号_C++_Multithreading_Qt_Signals Slots_Qthread - Fatal编程技术网

C++ 如何在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::

我已经用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();
};

如何调用输出另一个threadID的信号?

实现
Thread1
构造函数,如下所示:

Thread1(QObject* parent) { moveToThread(this); }

执行
Thread1
构造函数,如下所示:

Thread1(QObject* parent) { moveToThread(this); }

你把它倒过来了。
QThread
是线程句柄,而不是线程本身。如果您想在另一个线程中运行某些内容,它属于移动到线程的普通
QObject
。您根本不需要从
QThread
派生!您也不应该将
QThread
的基
QObject
移动到线程本身。您要做的是在线程本身中有一个线程的句柄。一旦线程完成,句柄就变得不起作用(带有null
thread()
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
移动到线程本身。您要做的是在线程本身中有一个线程的句柄。一旦线程完成,句柄就变得不起作用(带有null
thread()
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正确。