Rabbit Remote Control 0.1.0-bate10
Loading...
Searching...
No Matches
PluginBackendThread.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QLoggingCategory>
4#include <QMetaMethod>
5#include "PluginThread.h"
6#include "PluginBackendThread.h"
7
8static Q_LOGGING_CATEGORY(log, "Plugin.Backend.Thread")
10 : CPlugin{parent}
11 , m_pThread(nullptr)
12{
13 m_pThread = new CPluginThread(); // Note that the parent object pointer cannot be set here.
14 if(m_pThread)
15 {
16 // The object is also deleted when the thread finishes executing.
17 bool check = connect(m_pThread, SIGNAL(finished()),
18 m_pThread, SLOT(deleteLater()));
19 Q_ASSERT(check);
20 m_pThread->start();
21 }
22}
23
24CPluginBackendThread::~CPluginBackendThread()
25{
26 qDebug(log) << Q_FUNC_INFO;
27 if(m_pThread)
28 m_pThread->quit(); // The don't deleteLater().
29 // because of it is connected finished signal
30}
31
37{
38 auto* pOperate = CPlugin::CreateOperate(szId, para);
39 if(!pOperate) return nullptr;
40 QString szMsg;
41 szMsg = "Please generate plugin from template using the script `./Script/create_plugin.sh --template=QtEvent`. or ";
42 szMsg += QString(pOperate->metaObject()->className());
43 szMsg += " include `sigNewBackend(COperate*)`, `sigDeleteBackend(COperate*)` and `Q_INVOKABLE virtual CBackend* InstanceBackend()`";
44 /*
45 const QMetaObject* metaObject = pOperate->metaObject();
46 QStringList methods;
47 for(int i = 0; i < metaObject->methodCount(); ++i)
48 methods << QString::fromLatin1(metaObject->method(i).methodSignature());
49 qDebug(log) << methods;
50 //*/
51 if(-1 == pOperate->metaObject()->indexOfMethod("InstanceBackend()")) {
52 QString szErr;
53 szErr = "The class " + QString(pOperate->metaObject()->className())
54 + " has not method InstanceBackend(). "
55 "Please add 'Q_INVOKABLE virtual CBackend* InstanceBackend()' to "
56 + QString(pOperate->metaObject()->className());
57 szErr += ". " + szMsg;
58 qCritical(log) << szErr;
59 Q_ASSERT_X(false, "CPluginBackendThread", szErr.toStdString().c_str());
60 }
61 if(-1 == pOperate->metaObject()->indexOfMethod("sigNewBackend(COperate*)")) {
62 QString szErr;
63 szErr = "The class " + QString(pOperate->metaObject()->className())
64 + " has not signal sigNewBackend(). "
65 "Please add 'void sigNewBackend();' to "
66 + QString(pOperate->metaObject()->className());
67 szErr += ". " + szMsg;
68 qCritical(log) << szErr;
69 Q_ASSERT_X(false, "CPluginBackendThread", szErr.toStdString().c_str());
70 }
71 if(-1 == pOperate->metaObject()->indexOfMethod("sigDeleteBackend(COperate*)")) {
72 QString szErr;
73 szErr = "The class " + QString(pOperate->metaObject()->className())
74 + " has not signal sigDeleteBackend(). "
75 "Please add 'void sigDeleteBackend();' to "
76 + QString(pOperate->metaObject()->className());
77 szErr += ". " + szMsg;
78 qCritical(log) << szErr;
79 Q_ASSERT_X(false, "CPluginBackendThread", szErr.toStdString().c_str());
80 }
81
82 Q_ASSERT(m_pThread);
83
84 bool check = connect(pOperate, SIGNAL(sigNewBackend(COperate*)),
85 m_pThread, SIGNAL(sigNewBackend(COperate*)));
86 Q_ASSERT(check);
87 check = connect(pOperate, SIGNAL(sigDeleteBackend(COperate*)),
88 m_pThread, SIGNAL(sigDeleteBackend(COperate*)));
89 Q_ASSERT(check);
90
91 return pOperate;
92}
Operate interface.
Definition Operate.h:51
Global parameters of plugins.
The plugin has a background thread, and all backend of the operations run on this background thread.
virtual COperate * CreateOperate(const QString &szId, CParameterPlugin *para) override
Create operate and connect signals to CPluginThread.
One thread handles multiple operate.
Plugin interface.
Definition Plugin.h:15
virtual Q_INVOKABLE COperate * CreateOperate(const QString &szId, CParameterPlugin *para)
New COperate instance.
Definition Plugin.cpp:82