【发布时间】:2021-12-18 21:58:38
【问题描述】:
main 中的 someClass some1 类对象在 qml 上下文中创建和注册。这个类创建了一个类someClass2Var = new someClass2 ();,它被推送到线程someClass2Var-> moveToThread (& someThread);。在这个类someClass2Var在线程someThread内部运行(运行)期间创建了两个对象:
发出someClass4Var = new someClass4 (); 和someClass3Var = new someClass3 (); 和signalVarCreated () 信号;在课堂上建立联系someClassconnect (this, & someClass :: signalsomeClass3fromSomeClass, someClass2Var.someClass3Var, & someClass3 :: signalsomeClass3) ;。
从qml调用信号signalsomeClass3fromSomeClass时,应该调用信号
someClass3 :: signalsomeClass3 反过来调用插槽 someClass4 :: slotsomeClass4 - 但它没有。为什么?
如何实现主线程与另一个线程中创建的对象的通信?这是第一个问题。
第二个问题:someClass3 和someClass4 类在同一个线程someThread 中,在someClass3 类中,当调用完成时会创建一个计时器并发出
与插槽someClass4 :: slotsomeClass4 关联的signalsomeClass3 () 信号,但调用也不会发生。为什么?如何实施?有可能吗?
这个版本的工作是考虑让应用程序在Android上工作,有一个项目在Windows下工作,当在Android中调用另一个服务时,应用程序会停止,我的想法是将必要的类转移到一个单独的线程,正如实践所表明的那样,它不会停止,与主线程不同,在当前项目中一切都已实现,所以我想尽可能多地这样做 要使用它,上述实现将是一个解决方案..
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
someClass some1;
qmlRegisterType<someClass>("FuelCore", 1, 0, "SomeClass");
engine.rootContext()->setContextProperty("MySomeClass", &some1);
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
//---------------------------------------------------------
#ifndef SOMECLASS_H
#define SOMECLASS_H
#include <QObject>
#include <QThread>
#include "someclass2.h"
#include "someclass3.h"
#include "someclass4.h"
class someClass : public QObject
{
Q_OBJECT
public:
explicit someClass(QObject *parent = nullptr);
someClass2* someClass2Var;
QThread someThread;
signals:
void signalSomeClass();
void signalsomeClass3fromSomeClass();
};
#endif // SOMECLASS_H
//------------------------------------------------------------
#include "someclass.h"
someClass::someClass(QObject *parent) : QObject(parent)
{
someClass2Var = new someClass2();
connect(&someClass2Var, &someClass2::signalVarCreated, this, [this](){
connect(this,&someClass::signalsomeClass3fromSomeClass,someClass2Var.someClass3Var,&someClass3::signalsomeClass3);
});
connect(&someThread, &QThread::started, someClass2Var, &someClass2::run);
connect(this,&someClass::signalsomeClass3fromSomeClass,someClass2Var,&someClass2::signalsomeClass3_2);
someClass2Var->moveToThread(&someThread);
someClass2Var->setRunning(true);
someThread.start();
}
//----------------------------------------------------
#ifndef SOMECLASS2_H
#define SOMECLASS2_H
#include <QObject>
#include "someclass3.h"
#include "someclass4.h"
#include "someclass.h"
class someClass;
class someClass2 : public QObject
{
Q_OBJECT
public:
bool m_running;
explicit someClass2(QObject *parent = nullptr);
bool running() const;
void run();
int count;
void setRunning(bool running);
someClass3* someClass3Var;
someClass4* someClass4Var;
someClass *someParent;
signals:
void signalVarCreated();
void signalsomeClass3_2();
};
#endif // SOMECLASS2_H
//-------------------------------------------
#include "someclass2.h"
#include <QDebug>
#include <QThread>
someClass2::someClass2(QObject *parent) : QObject(parent)
{
}
bool someClass2::running() const
{
return m_running;
}
void someClass2::run()
{
someClass4Var= new someClass4();
someClass3Var= new someClass3();
connect(someClass3Var,&someClass3::signalsomeClass3,someClass4Var,&someClass4::slotsomeClass4);
signalVarCreated();
connect(this,&someClass2::signalsomeClass3_2,someClass4Var,&someClass4::slotsomeClass4);
while (m_running)
{
count++;
QThread::sleep (1);
}
}
void someClass2::setRunning(bool running)
{
if (m_running == running)
return;
m_running = running;
}
//----------------------------------------------------
#ifndef SOMECLASS3_H
#define SOMECLASS3_H
#include <QObject>
#include <QTimer>
class someClass3 : public QObject
{
Q_OBJECT
public:
explicit someClass3(QObject *parent = nullptr);
QTimer* tim;
signals:
void signalsomeClass3();
};
#endif // SOMECLASS3_H
//---------------------------------------------------
#include "someclass3.h"
#include <QThread>
#include <QDebug>
#include <QTimer>
someClass3::someClass3(QObject *parent) : QObject(parent)
{
tim = new QTimer();
tim->start(5000);
connect(tim, &QTimer::timeout, this, [this](){emit signalsomeClass3();});
}
//--------------------------------------------------
#ifndef SOMECLASS4_H
#define SOMECLASS4_H
#include <QObject>
#include <QDebug>
class someClass4 : public QObject
{
Q_OBJECT
public:
explicit someClass4(QObject *parent = nullptr);
signals:
public slots:
void slotsomeClass4() {qDebug()<<"voidslotsomeClass4";};
};
#endif // SOMECLASS4_H
//------------------------------------------------------------
Window {
visible: true
width: 640
height: 480
Button {
text: "Call someClass4 slot of object in QThread"
onClicked: {
MySomeClass.signalsomeClass3fromSomeClass()
}
}
}
【问题讨论】:
-
请edit您的问题:格式化文本,将其拆分为段落等等,以减少阅读的痛苦。
标签: c++ multithreading qt qml qthread