Rabbit Remote Control
0.1.0-bate16
Toggle main menu visibility
Loading...
Searching...
No Matches
Src
BackendThread.cpp
1
// Author: Kang Lin <kl222@126.com>
2
3
#include <QLoggingCategory>
4
#include <QMetaMethod>
5
#include "BackendThread.h"
6
#include "Backend.h"
7
8
static
Q_LOGGING_CATEGORY(log,
"BackendThread"
)
9
10
CBackendThread
::
CBackendThread
(
COperate
*pOperate, QObject *pParent)
11
: QThread(pParent)
12
, m_pOperate(pOperate)
13
, m_pBackend(
nullptr
)
14
{
15
if
(pOperate) {
16
m_szClassName = pOperate->metaObject()->className();
17
}
18
qDebug(log) << Q_FUNC_INFO << m_szClassName;
19
bool
check =
false
;
20
if
(
nullptr
== pParent) {
21
// It is deleted when it is finished.
22
check = connect(
this
, SIGNAL(finished()),
this
, SLOT(deleteLater()));
23
Q_ASSERT(check);
24
}
25
}
26
27
CBackendThread::~CBackendThread()
28
{
29
qDebug(log) << Q_FUNC_INFO << m_szClassName;
30
}
31
32
void
CBackendThread::quit
()
33
{
34
qDebug(log) << Q_FUNC_INFO;
35
QThread::quit();
36
if
(m_pBackend) {
37
m_pBackend->WakeUp();
38
}
39
}
40
51
void
CBackendThread::run
()
52
{
53
qDebug(log) << Q_FUNC_INFO <<
"start"
;
54
55
Q_ASSERT(m_pOperate);
56
int
nRet = 0;
57
/*
58
const QMetaObject* metaObject = m_pOperate->metaObject();
59
QStringList methods;
60
for(int i = 0; i < metaObject->methodCount(); ++i)
61
methods << QString::fromLatin1(metaObject->method(i).methodSignature());
62
qDebug(log) << methods;
63
//*/
64
if
(-1 == m_pOperate->metaObject()->indexOfMethod(
"InstanceBackend()"
))
65
{
66
QString szErr;
67
szErr =
"The class "
+ QString(m_pOperate->metaObject()->className())
68
+
" has not method InstanceBackend()."
69
"Please add 'Q_INVOKABLE virtual CBackend* InstanceBackend()' to "
70
+ QString(m_pOperate->metaObject()->className());
71
qCritical(log) << szErr;
72
Q_ASSERT_X(
false
,
"BackendThread"
, szErr.toStdString().c_str());
73
emit m_pOperate->sigFinished();
74
return
;
75
}
76
77
bool
bRet = QMetaObject::invokeMethod(
78
m_pOperate,
"InstanceBackend"
,
79
Qt::DirectConnection,
80
Q_RETURN_ARG(
CBackend
*, m_pBackend));
81
if
(!m_pBackend || !bRet)
82
{
83
qCritical(log) <<
"InstanceBackend fail"
;
84
emit m_pOperate->sigFinished();
85
return
;
86
}
87
88
if
(m_pBackend) {
89
nRet = m_pBackend->Start();
90
if
(nRet) {
91
qCritical(log) <<
"Backend start fail:"
<< nRet;
92
m_pBackend->Stop();
93
m_pBackend->deleteLater();
94
m_pBackend =
nullptr
;
95
//emit m_pOperate->sigFinished(); // 在 m_pBackend->Stop() 中触发
96
return
;
97
}
98
}
99
100
exec();
101
102
if
(m_pBackend) {
103
m_pBackend->Stop();
104
m_pBackend->deleteLater();
105
}
106
107
qDebug(log) << Q_FUNC_INFO <<
"end"
;
108
}
CBackendThread
The backend thread.
Definition
BackendThread.h:15
CBackendThread::run
virtual void run() override
Definition
BackendThread.cpp:51
CBackendThread::quit
void quit()
Quit.
Definition
BackendThread.cpp:32
CBackend
Backend interface.
Definition
Backend.h:52
COperate
Operate interface.
Definition
Operate.h:51
Author: Kang Lin (kl222@126.com)
Copyright (c) Kang Lin Studios All Rights Reserved