! * \~chinese * - 调用 COperateDesktop::InstanceBackend 实例化 CBackend * - 调用 CBackend::Start() 开始 * - 进入事件循环 * \~english * - Call COperateDesktop::InstanceBackend to instantiate CBackend * - Call CBackend::Connect() to start * - Enter event loop */
| 49 | * - Enter event loop |
| 50 | */ |
| 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 | } |
| 74 | |
| 75 | bool bRet = QMetaObject::invokeMethod( |
| 76 | m_pOperate, "InstanceBackend", |
| 77 | Qt::DirectConnection, |
| 78 | Q_RETURN_ARG(CBackend*, m_pBackend)); |
| 79 | if(!m_pBackend || !bRet) |
| 80 | { |
| 81 | qCritical(log) << "InstanceBackend fail"; |
| 82 | if(m_bFinishedSignal) { |
| 83 | emit m_pOperate->sigStop(); |
| 84 | emit m_pOperate->sigFinished(); |
| 85 | } |
| 86 | return; |
| 87 | } |
| 88 | |
| 89 | if(m_pBackend) { |
| 90 | nRet = m_pBackend->Start(); |
| 91 | if(nRet) { |
| 92 | qCritical(log) << "Backend start fail" << nRet; |
| 93 | m_pBackend->Stop(); |
| 94 | m_pBackend->deleteLater(); |
| 95 | m_pBackend = nullptr; |
| 96 | if(m_bFinishedSignal) { |
| 97 | emit m_pOperate->sigStop(); |
| 98 | emit m_pOperate->sigFinished(); |
| 99 | } |
| 100 | return; |
| 101 | } |
| 102 | } |
| 103 | |
| 104 | exec(); |
| 105 | |
| 106 | if(m_pBackend) { |
| 107 | m_pBackend->Stop(); |
| 108 | m_pBackend->deleteLater(); |