玉兔远程控制
0.1.0-bate11
Toggle main menu visibility
载入中...
搜索中...
未找到
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
qDebug(log) << Q_FUNC_INFO;
16
bool
check =
false
;
17
if
(
nullptr
== pParent) {
18
// It is deleted when it is finished.
19
check = connect(
this
, SIGNAL(finished()),
this
, SLOT(deleteLater()));
20
Q_ASSERT(check);
21
}
22
}
23
24
CBackendThread::~CBackendThread()
25
{
26
qDebug(log) << Q_FUNC_INFO;
27
}
28
29
void
CBackendThread::quit
()
30
{
31
qDebug(log) << Q_FUNC_INFO;
32
QThread::quit();
33
if
(m_pBackend) {
34
m_pBackend->WakeUp();
35
}
36
}
37
48
void
CBackendThread::run
()
49
{
50
qDebug(log) << Q_FUNC_INFO <<
"start"
;
51
52
Q_ASSERT(m_pOperate);
53
int
nRet = 0;
54
/*
55
const QMetaObject* metaObject = m_pOperate->metaObject();
56
QStringList methods;
57
for(int i = 0; i < metaObject->methodCount(); ++i)
58
methods << QString::fromLatin1(metaObject->method(i).methodSignature());
59
qDebug(log) << methods;
60
//*/
61
if
(-1 == m_pOperate->metaObject()->indexOfMethod(
"InstanceBackend()"
))
62
{
63
QString szErr;
64
szErr =
"The class "
+ QString(m_pOperate->metaObject()->className())
65
+
" has not method InstanceBackend()."
66
"Please add 'Q_INVOKABLE virtual CBackend* InstanceBackend()' to "
67
+ QString(m_pOperate->metaObject()->className());
68
qCritical(log) << szErr;
69
Q_ASSERT_X(
false
,
"BackendThread"
, szErr.toStdString().c_str());
70
emit m_pOperate->sigFinished();
71
return
;
72
}
73
74
bool
bRet = QMetaObject::invokeMethod(
75
m_pOperate,
"InstanceBackend"
,
76
Qt::DirectConnection,
77
Q_RETURN_ARG(
CBackend
*, m_pBackend));
78
if
(!m_pBackend || !bRet)
79
{
80
qCritical(log) <<
"InstanceBackend fail"
;
81
emit m_pOperate->sigFinished();
82
return
;
83
}
84
85
if
(m_pBackend) {
86
nRet = m_pBackend->Start();
87
if
(nRet) {
88
qCritical(log) <<
"Backend start fail:"
<< nRet;
89
m_pBackend->Stop();
90
m_pBackend->deleteLater();
91
m_pBackend =
nullptr
;
92
//emit m_pOperate->sigFinished(); // 在 m_pBackend->Stop() 中触发
93
return
;
94
}
95
}
96
97
exec();
98
99
if
(m_pBackend) {
100
m_pBackend->Stop();
101
m_pBackend->deleteLater();
102
}
103
104
qDebug(log) << Q_FUNC_INFO <<
"end"
;
105
}
CBackendThread
The backend thread
定义
BackendThread.h:15
CBackendThread::run
virtual void run() override
定义
BackendThread.cpp:48
CBackendThread::quit
void quit()
Quit
定义
BackendThread.cpp:29
CBackend
后端接口。它由协议插件实现。 它默认启动一个定时器来开启一个非 Qt 事件循环(就是普通的循环处理)。 详见: Start()、 slotTimeOut()、 OnProcess() 。 当然,它仍然支...
定义
Backend.h:52
COperate
操作接口。
定义
Operate.h:51
作者:康林 (kl222@126.com)
版权所有(c) 康林工作室 保留所有权力