LAPTOP-SNT8I5JK\Boounion
2025-08-18 8908f3613d5ca848249179d8c361576078f9781f
SourceCode/Bond/Servo/CMaster.cpp
@@ -58,15 +58,21 @@
      m_bContinuousTransfer = false;
      m_nContinuousTransferCount = 0;
      m_nContinuousTransferStep = CTStep_Unknow;
      m_pControlJob = nullptr;
      InitializeCriticalSection(&m_criticalSection);
   }
   CMaster::~CMaster()
   {
      // 释放Job相关
      for (auto item : m_processJobs) {
         delete item;
      }
      m_processJobs.clear();
      if (m_pControlJob != nullptr) {
         delete m_pControlJob;
         m_pControlJob = nullptr;
      }
      if (m_hEventReadBitsThreadExit[0] != nullptr) {
         ::CloseHandle(m_hEventReadBitsThreadExit[0]);
@@ -1847,11 +1853,12 @@
      m_nContinuousTransferCount = round;
   }
   int CMaster::setProcessJobs(std::vector<SERVO::CProcessJob*>& pjs)
   int CMaster::setProcessJobs(std::vector<CProcessJob*>& pjs)
   {
      std::vector<SERVO::CProcessJob*> temp;
      for (auto p : pjs) {
         if (p->validate(*this)) {
            p->queue();
            temp.push_back(p);
         }
      }
@@ -1860,11 +1867,61 @@
      return m_processJobs.size();
   }
   std::vector<SERVO::CProcessJob*>& CMaster::getProcessJobs()
   std::vector<CProcessJob*>& CMaster::getProcessJobs()
   {
      return m_processJobs;
   }
   CProcessJob* CMaster::getProcessJob(const std::string& id)
   {
      for (auto item : m_processJobs) {
         if (item->id().compare(id) == 0) return item;
      }
      return nullptr;
   }
   int CMaster::setControlJob(CControlJob& controlJob)
   {
      // 回调:是否参创建ControlJob
      auto canCreateCjFn = [&](uint32_t& cc, std::string& mm) -> bool {
         if (m_pControlJob != nullptr) {
            cc = 1100;
            mm = "当前ControlJob未结批,不能创建新的ControlJob";
            return false;
         }
         return true;
      };
      // 回调:是否存在
      auto pjExists = [&](const std::string& id) -> bool {
         return getProcessJob(id) != nullptr;
      };
      // 回调:是否可加入 CJ(这里定义:必须是 Queued)
      auto pjJoinable = [&](const std::string& id) -> bool {
         auto pj = getProcessJob(id);
         if (pj == nullptr) return false;
         return pj->state() == PJState::Queued;
      };
      bool bRet = controlJob.validateForCreate(canCreateCjFn, pjExists, pjJoinable);
      if (!bRet) return -1;
      std::vector<CProcessJob*> temps;
      m_pControlJob = new CControlJob(controlJob);
      auto pjIds = controlJob.pjIds();
      for (auto id : pjIds) {
         auto pj = getProcessJob(id);
         if (pj != nullptr) {
            temps.push_back(pj);
         }
      }
      m_pControlJob->setPJs(temps);
      return 0;
   }
   CLoadPort* CMaster::getPortWithCarrierId(const std::string& carrierId) const
   {
      CLoadPort* pPort;