如何在同一线程中移动 class
How to move class in the same thread
我正在尝试在用 C++ 和 QT 编写的应用程序中添加线程。
我有一个 class 框架和一个名称 DeviceMngr。
framework.h定义如下:
class Framework : public QObject
{
Q_OBJECT
QThread FrameWorkThread;
public:
Framework();
框架由main初始化。我的 Main 正在做 :
QApplication app(argc, argv);
QThread FrameWorkThread;
Framework *DeviceFramework = new Framework;
DeviceFramework->moveToThread(&FrameWorkThread);
QObject::connect(&FrameWorkThread, SIGNAL(finished()), DeviceFramework, SLOT(deleteLater()));
之后,其中的 main Windows 并将 DeviceFramework 作为参数。
MainUI MyWindows(*DeviceFramework);
MyWindows 正在使用 Signal/slots 与 DeviceFramework 进行讨论。
基于框架的是使用 class DeviceMngr 和方法访问 android 设备。
我怎么可能在与框架相同的线程中添加 DeviceMngr。
我可以在 framework.cpp:
中做这样的事情吗
Framework::Framework()
{
Device = new DeviceMngr();
Device->moveToThread(&FrameWorkThread);
}
设备管理器声明如下:
class DeviceMngr : public QObject
{
QThread FrameWorkThread;
public:
DeviceMngr();
~DeviceMngr();
这个方法是把框架和设备管理器放在FrameWorkThread中吗?
谢谢
塞巴斯蒂安
您的 DeviceMngr 和 Framework 实例可以在同一个线程中。为此,您需要将您希望它们之间共有的 QThread 实例保存在一个地方(或传递一个指针)。
您是否有理由不让您的 DeviceMngr 实例成为 Framework 的子实例? QObject 的文档说明了以下关于 QObject 实例的子实例的线程亲和性:
The QObject::moveToThread() function changes the thread affinity for
an object and its children (the object cannot be moved if it has a
parent).
http://doc.qt.io/qt-5/threads-qobject.html
这将是在 FrameWorkThread 上获取两个对象的最简单方法。
main.cpp
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QThread FrameWorkThread;
Framework *DeviceFramework = new Framework();
DeviceFramework->moveToThread(&FrameWorkThread);
QObject::connect(&FrameWorkThread, SIGNAL(finished()), DeviceFramework, SLOT(deleteLater()));
}
framework.hpp
class Framework : public QObject
{
Q_OBJECT
public:
Framework();
}
framework.cpp
Framework::Framework()
{
Device = new DeviceMngr(this);
}
我正在尝试在用 C++ 和 QT 编写的应用程序中添加线程。
我有一个 class 框架和一个名称 DeviceMngr。
framework.h定义如下:
class Framework : public QObject
{
Q_OBJECT
QThread FrameWorkThread;
public:
Framework();
框架由main初始化。我的 Main 正在做 :
QApplication app(argc, argv);
QThread FrameWorkThread;
Framework *DeviceFramework = new Framework;
DeviceFramework->moveToThread(&FrameWorkThread);
QObject::connect(&FrameWorkThread, SIGNAL(finished()), DeviceFramework, SLOT(deleteLater()));
之后,其中的 main Windows 并将 DeviceFramework 作为参数。
MainUI MyWindows(*DeviceFramework);
MyWindows 正在使用 Signal/slots 与 DeviceFramework 进行讨论。
基于框架的是使用 class DeviceMngr 和方法访问 android 设备。
我怎么可能在与框架相同的线程中添加 DeviceMngr。
我可以在 framework.cpp:
中做这样的事情吗Framework::Framework()
{
Device = new DeviceMngr();
Device->moveToThread(&FrameWorkThread);
}
设备管理器声明如下:
class DeviceMngr : public QObject
{
QThread FrameWorkThread;
public:
DeviceMngr();
~DeviceMngr();
这个方法是把框架和设备管理器放在FrameWorkThread中吗?
谢谢 塞巴斯蒂安
您的 DeviceMngr 和 Framework 实例可以在同一个线程中。为此,您需要将您希望它们之间共有的 QThread 实例保存在一个地方(或传递一个指针)。
您是否有理由不让您的 DeviceMngr 实例成为 Framework 的子实例? QObject 的文档说明了以下关于 QObject 实例的子实例的线程亲和性:
The QObject::moveToThread() function changes the thread affinity for an object and its children (the object cannot be moved if it has a parent).
http://doc.qt.io/qt-5/threads-qobject.html
这将是在 FrameWorkThread 上获取两个对象的最简单方法。
main.cpp
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QThread FrameWorkThread;
Framework *DeviceFramework = new Framework();
DeviceFramework->moveToThread(&FrameWorkThread);
QObject::connect(&FrameWorkThread, SIGNAL(finished()), DeviceFramework, SLOT(deleteLater()));
}
framework.hpp
class Framework : public QObject
{
Q_OBJECT
public:
Framework();
}
framework.cpp
Framework::Framework()
{
Device = new DeviceMngr(this);
}