/************************************************************************************************** 版本所有(C), 2020-2022, 北京普达迪泰 *************************************************************************************************** 文 件 名: IDPMSManager.cpp 功能描述: IDPMS管理员,采用单例模式 版 本 号: 1.00初版 作 者: HYF 生成日期; 2021-12-20 最近修改: 函数列表: 修改历史: 1.日 期 :2021-12-20 作 者 : HYF 修改内容 : 创建文件 **************************************************************************************************/ #include "pch.h" #include "IDPMSManager.h" #include "IDPMSComm.h" #include "PostureDataPointManager.h" #include "PostureDataAngleManager.h" #include "StaticData.h" #include "IDCMParser.h" #include "DynamicData.h" #include "DynamicTaskThread.h" #include "StaticTaskThread.h" #include "CameraTaskThread.h" #include "IDPMSDeamon.h" IDPMSManager* IDPMSManager::m_pManager = NULL; IDPMSManager::CGarbo garbo; // 构造函数 IDPMSManager::IDPMSManager() { m_bIDPMSRunning = FALSE; // 启动IDPMS进程 if (!FindIDPMS()) { StartIDPMS2(); } // 动态任务指针初始化 m_pDynamicTask = NULL; } /************************************************************************************************** 函 数 名 :IDPMSManager 功能描述 :析构函数,但实际不会执行 输出参数 :略 返 回 值 :略 **************************************************************************************************/ IDPMSManager::~IDPMSManager() { if (m_pDynamicData != NULL) { m_pDynamicData->Clear(); delete m_pDynamicData; m_pDynamicData = NULL; } } /************************************************************************************************** 函 数 名 :GetManager 功能描述 :获取数据库连接 输出参数 :略 返 回 值 :略 **************************************************************************************************/ IDPMSManager* IDPMSManager::GetManager() { if (m_pManager == NULL) { CMutex mux; mux.Lock(); if (m_pManager == NULL) { m_pManager = new IDPMSManager(); } mux.Unlock(); } return m_pManager; } /************************************************************************************************** 函 数 名 :StartIDPMS1 功能描述 :连接IDPMS 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::StartIDPMS1() { BOOL bRet = TRUE; if (!FindWindow(NULL,g_szIDPMSWindowTitle.GetBuffer())) { ::ShellExecute(NULL, NULL, g_szIDPMSPath, NULL, "", SW_SHOW); } return bRet; } /************************************************************************************************** 函 数 名 :StartIDPMS2 功能描述 :连接IDPMS 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::StartIDPMS2() { STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags=STARTF_USESHOWWINDOW; si.wShowWindow=SW_HIDE; PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); BOOL bRet = CreateProcess(g_szIDPMSPath.GetBuffer(), NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi); if (!bRet) { AfxMessageBox("IDPMS启动失败"); LOG::E(_T("IDPMS启动失败")); return FALSE; } // 等待新进程初始化完毕 //WaitForInputIdle(pi.hProcess, 10000); //Sleep(2000); //if (g_iFindIDPMSType == 1) { int iTime = 0; while (TRUE) { iTime++; BOOL bRet = this->FindIDPMS(); if (bRet) { return TRUE; } Sleep(1000); if (iTime >= 3) { break; } } AfxMessageBox("IDPMS启动失败"); LOG::E(_T("IDPMS启动失败")); return FALSE; } /************************************************************************************************** 函 数 名 :StartIDPMS2 功能描述 :连接IDPMS 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::StartIDPMS21() { STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); BOOL bRet = CreateProcess(g_szIDPMSPath.GetBuffer(), NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi); if (!bRet) { AfxMessageBox("IDPMS启动失败"); LOG::E(_T("IDPMS启动失败")); return FALSE; } // 等待新进程初始化完毕 WaitForInputIdle(pi.hProcess, 10000); if (g_iFindIDPMSType == 1) { this->FindIDPMS(); return TRUE; } PROCESS_INFO procwin; procwin.dwProcessId = pi.dwProcessId; procwin.hWnd = NULL; EnumWindows(EnumWindowCallBack, (LPARAM)&procwin); if (NULL == procwin.hWnd) { Sleep(200); EnumWindows(EnumWindowCallBack, (LPARAM)&procwin); } // 赋值全局量 g_hIDPMSHWnd = procwin.hWnd; //窗口HWND g_dwIDPMSProcessId = procwin.dwProcessId; //进程ID ::ShowWindow(g_hIDPMSHWnd, SW_HIDE); return TRUE; } /************************************************************************************************** 函 数 名 :StartIDPMS3 功能描述 :异步启动IDPMS 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::StartIDPMS3() { //创建Thread 先挂起 IDPMSDeamon *pIDPMSDeamonThread = (IDPMSDeamon*)AfxBeginThread(RUNTIME_CLASS(IDPMSDeamon), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); pIDPMSDeamonThread->m_bAutoDelete = FALSE; pIDPMSDeamonThread->ResumeThread(); pIDPMSDeamonThread->PostThreadMessage(WM_START_IDPMS, NULL, NULL); WaitForSingleObject(pIDPMSDeamonThread->m_hThread, INFINITE); delete pIDPMSDeamonThread; return TRUE; } /************************************************************************************************** 函 数 名 :SetTopWindow 功能描述 :设置IDPMS窗口到最前端 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::SetTopWindow(HWND hWnd) { HWND hForeWnd = GetForegroundWindow(); DWORD dwForeID = GetWindowThreadProcessId(hForeWnd, NULL); DWORD dwCurID = GetCurrentThreadId(); AttachThreadInput(dwCurID, dwForeID, TRUE); ShowWindow(hWnd, SW_SHOWNORMAL); SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); SetForegroundWindow(hWnd); AttachThreadInput(dwCurID, dwForeID, FALSE); return TRUE; } /************************************************************************************************** 函 数 名 :AttachIDPMS 功能描述 :附加IDPMS到指定窗体 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::AttachIDPMS(CWnd *pWnd) { // 初始化 if (g_hIDPMSHWnd) { CRect rectShow; pWnd->GetClientRect(&rectShow); ::SetParent(g_hIDPMSHWnd, pWnd->GetSafeHwnd()); LONG style = GetWindowLong(g_hIDPMSHWnd, GWL_STYLE);// 14CF 0000 style &= ~WS_CAPTION; style &= ~WS_THICKFRAME; style |= WS_VISIBLE; SetWindowLong(g_hIDPMSHWnd, GWL_STYLE, style);//eraze title of ms paint window. ::MoveWindow(g_hIDPMSHWnd, rectShow.left, rectShow.top, rectShow.right, rectShow.bottom, true); ::UpdateWindow(g_hIDPMSHWnd); ::ShowWindow(g_hIDPMSHWnd, SW_SHOW); IDPMSManager *pManager = IDPMSManager::GetManager(); pManager->SetTopWindow(g_hIDPMSHWnd); } return TRUE; } /************************************************************************************************** 函 数 名 :FindIDPMS 功能描述 :判断IDPMS是否已启动 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::FindIDPMS() { // 查找IDPMS主窗口 HWND hWnd = ::FindWindow(NULL, g_szIDPMSWindowTitle.GetBuffer()); if (hWnd != NULL) { DWORD pid = 0; GetWindowThreadProcessId(hWnd, &pid); g_hIDPMSHWnd = hWnd; g_dwIDPMSProcessId = pid; ::ShowWindow(g_hIDPMSHWnd, SW_HIDE); // 发现IDPMS,返回TRUE; return TRUE; } // 没有发现IDPMS,则返回FALSE; return FALSE; } /************************************************************************************************** 函 数 名 :DetachIDPMS 功能描述 :附加IDPMS到指定窗体 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::DetachIDPMS(CWnd *pWnd) { return TRUE; } /************************************************************************************************** 函 数 名 :CloseIDPMS 功能描述 :终止IDPMS 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void IDPMSManager::CloseIDPMS() { HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, false, g_dwIDPMSProcessId); BOOL bRet = TerminateProcess(hProcess, 0); CloseHandle(hProcess); return; } /************************************************************************************************** 函 数 名 :CloseIDPMSProject 功能描述 :Close IDPMS Project 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::CloseIDPMSProject() { CString szCommand; BOOL bRet = TRUE; int iRet = 0; DMSResponse *pRes = NULL; int iSizeRecevied = 0; // IDPMS通讯器 IDPMSComm *pComm = new IDPMSComm(); bRet = pComm->Open(); if (!bRet) { delete pComm; return FALSE; } // 1.结束当前工程 szCommand.Format("IDPMS-CD:SET0003"); iRet = pComm->SendCommand(szCommand, pRes); if (iRet <= 0) { pComm->Close(); delete pComm; return TRUE; } return TRUE; } /************************************************************************************************** 函 数 名 :SingleCameraConfigProc 功能描述 :单相机标定 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::SingleCameraConfigProc(int iCam, DMSResponse *&pRes) { BOOL bRet = TRUE; // IDPMS通讯器 IDPMSComm *pComm = new IDPMSComm(); pComm->Open(); // 1.结束当前工程 CString szCommand; szCommand.Format("IDPMS-CD:SET0003"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 2. 删除之前的工程文件夹 CString szCameraFolder; szCameraFolder.Format("C:\\PD\\IDPMS\\工程\\%d号相机", iCam); Utils::DeleteFolder(szCameraFolder); // 3.新建工程 szCommand.Format("IDCMD0017(PDTL=%d号模板,PDSV=%d号相机,PDDT= false)", iCam, iCam); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 4.读取路径下相机相片 szCommand.Format("IDPMS-CD:SET0008"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // // 5.读取当前路径下的全部相片 // szCommand.Format("IDPMS-CD:SET1701:C:/PD/1号/内参"); // bRet = pComm->SendCommand(szCommand, pRes); // if (!bRet) { // pComm->Close(); //delete pComm; // return FALSE; // } // 5.读取当前路径下的全部相片 szCommand.Format("IDPMS-CD:SET1701:D:/BD"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 6.开始自动测量 szCommand.Format("IDCMD0016(PDST=true,PDGO=true,PDCE=true,PDWN=false,PDFP=false,PDSS=true)"); bRet = pComm->SendCommand(szCommand, pRes, _T("CPDSimpleBundleStats")); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 关闭通讯器 pComm->Close(); delete pComm; return TRUE; } /************************************************************************************************** 函 数 名 :DoubleCameraConfig1Proc 功能描述 :双相机标定-建立工程 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::DoubleCameraConfig1Proc(LPCTSTR szEquipTypeCode, LPCTSTR szEquipCode, DMSResponse *&pRes) { BOOL bRet = TRUE; // IDPMS通讯器 IDPMSComm *pComm = new IDPMSComm(); pComm->Open(); // 1.结束当前工程 CString szCommand; szCommand.Format("IDPMS-CD:SET0003"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 2.删除之前的工程文件 CString szCameraFolder; szCameraFolder.Format("C:\\PD\\IDPMS\\工程\\%s_%s_双相机", szEquipTypeCode, szEquipCode); Utils::DeleteFolder(szCameraFolder); // 3. Copy相机驱动文件 CString szSourceCam; CString szTargetCam; szSourceCam.Format("C:\\PD\\IDPMS\\工程\\1号相机\\BDAData\\PDDT-HCCAM_CLG1.cam"); szTargetCam.Format("C:\\Program Files\\PD\\IDPMS\\模板工程\\双相机\\PDDT-HCCAM_CLG1.cam"); CopyFile(szSourceCam, szTargetCam, FALSE); szSourceCam.Format("C:\\PD\\IDPMS\\工程\\2号相机\\BDAData\\PDDT-HCCAM_CLG2.cam"); szTargetCam.Format("C:\\Program Files\\PD\\IDPMS\\模板工程\\双相机\\PDDT-HCCAM_CLG2.cam"); CopyFile(szSourceCam, szTargetCam, FALSE); // 4.双相机工程建立 szCommand.Format("IDCMD0017(PDTL=双相机,PDSV=%s_%s_双相机,PDDT= false)", szEquipTypeCode, szEquipCode); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 关闭通讯器 pComm->Close(); delete pComm; return TRUE; } /************************************************************************************************** 函 数 名 :DoubleCameraConfig2Proc 功能描述 :双相机标定-外参标定 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::DoubleCameraConfig2Proc(LPCTSTR szEquipTypeCode, LPCTSTR szEquipCode, DMSResponse *&pRes) { BOOL bRet = TRUE; // IDPMS通讯器 IDPMSComm *pComm = new IDPMSComm(); pComm->Open(); // 1.选择机架文件作为模板 CString szCommand; szCommand.Format("IDPMS-CD:SET1401:PDFN=机架"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 2.拍摄一次 szCommand.Format("IDPMS-CD:SET2901)"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } Sleep(2000); // 3.选择机架上建立坐标点 szCommand.Format("IDCMD0025(PDFN=TRI3D E1,PDMP=flase, PDDP=flase, PDCP=flase, PDPL=C1 C2 C3)"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 4.将机架上建立坐标点拷贝到RO3D szCommand.Format("IDCMD0032(PDFN=BDA3D,PDMP=true, PDDP=true, PDCP=true, PDAP=flase)"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 5.轴对准 szCommand.Format("IDPMS-CD:SET3701:p1=C1:p2=C2:p3=C3:p1x=0:p1y=0:p1z=0:p2type=type:p3type=type:sys=frame"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 3.双相机快速标定 //szCommand.Format("IDPMS-CD:SET2701"); //bRet = pComm->SendCommand(szCommand); //if (!bRet) { // szResult.Format("%s", pRes); // pComm->Close(); // return FALSE; //} // 关闭通讯器 pComm->Close(); delete pComm; return TRUE; } /************************************************************************************************** 函 数 名 :StaticTaskProc 功能描述 :静态任务处理 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::StaticTaskProc(DWORD dwTaskId, LPCTSTR szEquipTypeCode, LPCTSTR szEquipCode, DMSResponse *&pRes) { BOOL bRet = TRUE; // IDPMS通讯器 IDPMSComm *pComm = new IDPMSComm(); pComm->Open(); // 1.删除当前工程 CString szCommand; szCommand.Format("IDPMS-CD:SET0003"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 2.删除之前的工程文件 CString szCameraFolder; szCameraFolder.Format("C:\\PD\\IDPMS\\工程\\%s_%s_单相机", szEquipTypeCode, szEquipCode); Utils::DeleteFolder(szCameraFolder); //// 3.Copy相机驱动文件 //CString szSourceCam("C:\\PD\\IDPMS\\工程\\1号相机\\平差数据\\PDDT-HCCAM_CLG1.cam"); //CString szTargetCam; //szTargetCam.Format("C:\\Program Files\\PD\\IDPMS\\模板工程\\%s\\PDDT-HCCAM_CLG1.cam", szEquipTypeCode); //CopyFile(szSourceCam, szTargetCam, FALSE); // 4.根据模板新建文件 szCommand.Format("IDCMD0017(PDTL=%s,PDSV=%s_%s_单相机,PDDT= false)", szEquipTypeCode, szEquipTypeCode, szEquipCode); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 5.读取单相机相片 szCommand.Format("IDPMS-CD:SET0008"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 6.读取当前路径下所有相片 //szCommand.Format("IDPMS-CD:SET1701:C:/PD/1号/内参"); szCommand.Format("IDPMS-CD:SET1701:"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 7.开始测量 szCommand.Format("IDCMD0016(PDST=true,PDGO=true,PDCE=true,PDWN=false,PDFP=false,PDSS=true)"); bRet = pComm->SendCommand(szCommand, pRes, _T("CPDSimpleBundleStats")); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 8.轴对准 szCommand.Format("IDPMS-CD:SET3701:p1=PC1:p2=GK1:p3=GK2:p1x=0:p1y=0:p1z=0:p2type=type:p3type=type:sys=frame"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 9.生成当前型号测量数据 szCommand.Format("IDPMS-CD:SET6201:SUB6201:PDSD=false:PDNM=BDA3D2"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 10.解析报告文件 CString szFile; szFile.Format("C:\\PD\\IDPMS\\工程\\%s_%s\\BDA3D2.txt", szEquipTypeCode, szEquipCode); StaticData data(dwTaskId, szEquipTypeCode, szEquipCode); data.LoadDataFromFile(szFile); // 11.保存到数据库 data.SaveToDB(); // 12.生成动态测量驱动TXT文件 // 关闭通讯器 pComm->Close(); delete pComm; return TRUE; } /************************************************************************************************** 函 数 名 :DynamicTaskProc 功能描述 :动态任务处理 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::DynamicTaskProc(DWORD taskId, LPCTSTR szEquipTypeCode, LPCTSTR szEquipCode, LPCTSTR szEquipPlace, DMSResponse *&pRes) { BOOL bRet = TRUE; // IDPMS通讯器 IDPMSComm *pComm = new IDPMSComm(); pComm->Open(); // 1. 结束当前进程 CString szCommand; szCommand.Format("IDPMS-CD:SET0003"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 2. 打开双相机工程 szCommand.Format("IDPMS-CD:SET0001:C:\\PD\\IDPMS\\工程\\%s_%s_双相机\\%s_%s_双相机.prj", szEquipTypeCode, szEquipCode, szEquipTypeCode, szEquipCode); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 3. 选择分机文件作为驱动 szCommand.Format("IDCMD0004(PDFN=%s)", szEquipPlace); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 4.选择多相机模式 szCommand.Format("IDCMD0036()"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 5. 设置拍摄一次输出一次数据 szCommand.Format("IDPMS-CD:IDCT:TS0009"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 6. 循环发指令拍摄 szCommand.Format("IDPMS-CD:SET2901"); bRet = pComm->SendCommand(szCommand, pRes); if (!bRet) { pComm->Close(); delete pComm; return FALSE; } // 关闭通讯器 pComm->Close(); delete pComm; return TRUE; } /************************************************************************************************** 函 数 名 :StartStaticProcThread 功能描述 :静态任务处理 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::StartStaticProcThread(CWnd* pOwner, DWORD taskId, LPCTSTR szEquipTypeCode, LPCTSTR szEquipCode) { //创建Thread, 先挂起 StaticTaskThread * pStaticTask = (StaticTaskThread*)AfxBeginThread( RUNTIME_CLASS(StaticTaskThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); pStaticTask->SetOwner(pOwner); pStaticTask->SetTaskId(taskId); pStaticTask->SetEquipTypeCode(szEquipTypeCode); pStaticTask->SetEquipCode(szEquipCode); pStaticTask->ResumeThread(); pStaticTask->PostThreadMessage(WM_STATIC, NULL,NULL); return TRUE; } /************************************************************************************************** 函 数 名 :StartStaticProcThread 功能描述 :静态任务处理 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::StartStaticDataProcThread(CWnd* pOwner, DWORD taskId, LPCTSTR szEquipTypeCode, LPCTSTR szEquipCode) { //创建Thread, 先挂起 StaticTaskThread * pStaticTask = (StaticTaskThread*)AfxBeginThread(RUNTIME_CLASS(StaticTaskThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); pStaticTask->SetOwner(pOwner); pStaticTask->SetTaskId(taskId); pStaticTask->SetEquipTypeCode(szEquipTypeCode); pStaticTask->SetEquipCode(szEquipCode); pStaticTask->ResumeThread(); pStaticTask->PostThreadMessage(WM_STATIC_DATA, NULL, NULL); return TRUE; } /************************************************************************************************** 函 数 名 :StartDynamicProcThread 功能描述 :动态任务处理 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::StartDynamicProcThread(CWnd* pOwner, DWORD taskId, LPCTSTR szEquipTypeCode, LPCTSTR szEquipCode, LPCTSTR szEquipPlace) { //创建Thread 先挂起 m_pDynamicTask = (DynamicTaskThread*) AfxBeginThread( RUNTIME_CLASS(DynamicTaskThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); // 动态测量数据 if (m_pDynamicData != NULL) { m_pDynamicData->Clear(); delete m_pDynamicData; m_pDynamicData = NULL; } m_pDynamicData = new DynamicData(taskId, szEquipTypeCode, szEquipCode, szEquipPlace); m_pDynamicTask->SetOwner(pOwner); m_pDynamicTask->SetTaskId(taskId); m_pDynamicTask->SetEquipTypeCode(szEquipTypeCode); m_pDynamicTask->SetEquipCode(szEquipCode); m_pDynamicTask->SetEquipPlace(szEquipPlace); m_pDynamicTask->SetDynamicDataPtr(m_pDynamicData); m_pDynamicTask->ResumeThread(); m_pDynamicTask->PostThreadMessage(WM_DYNAMIC, NULL,NULL); return TRUE; } /************************************************************************************************** 函 数 名 :SetDynamicTaskTimeSpan 功能描述 :设置动态测量时间 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void IDPMSManager::SetDynamicTaskTimeSpan(int iSpan) { if (m_pDynamicTask != NULL) { m_pDynamicTask->SetTimeSpan(iSpan); } } /************************************************************************************************** 函 数 名 :StopDynamicTask 功能描述 :停止测量 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void IDPMSManager::StopDynamicTask() { if (m_pDynamicTask != NULL) { m_pDynamicTask->Stop(); } } /************************************************************************************************** 函 数 名 :TerminateDynamicTask 功能描述 :终止测量线程 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void IDPMSManager::TerminateDynamicTask() { if (m_pDynamicTask != NULL) { TerminateThread(m_pDynamicTask->m_hThread, 0); } } /************************************************************************************************** 函 数 名 :PauseDynamicTask 功能描述 :停止测量 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void IDPMSManager::PauseDynamicTask() { if (m_pDynamicTask != NULL) { m_pDynamicTask->Pause(); } } /************************************************************************************************** 函 数 名 :PauseDynamicTask 功能描述 :停止测量 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void IDPMSManager::ResumeDynamicTask() { if (m_pDynamicTask != NULL) { m_pDynamicTask->Resume(); } } /************************************************************************************************** 函 数 名 :SingleCameraConfigProcThread 功能描述 :单相机标定 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::SingleCameraConfigProcThread(CWnd* pOwner, int iCam) { //创建Thread 先挂起 CameraTaskThread *pCameraTask = (CameraTaskThread*) AfxBeginThread( RUNTIME_CLASS(CameraTaskThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); pCameraTask->SetOwner(pOwner); pCameraTask->ResumeThread(); pCameraTask->PostThreadMessage(WM_SINGLE_CAM_CONFIG, iCam,NULL); return TRUE; } /************************************************************************************************** 函 数 名 :DoubleCameraConfigStep1ProcThread 功能描述 :双相机标定:建立工程 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::DoubleCameraConfigStep1ProcThread(CWnd* pOwner, LPCTSTR szEquipTypeCode, LPCTSTR szEquipCode) { //创建Thread 先挂起 CameraTaskThread *pCameraTask = (CameraTaskThread*) AfxBeginThread( RUNTIME_CLASS(CameraTaskThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); pCameraTask->SetOwner(pOwner); pCameraTask->SetEquipTypeCode(szEquipTypeCode); pCameraTask->SetEquipCode(szEquipCode); pCameraTask->ResumeThread(); pCameraTask->PostThreadMessage(WM_DOUBLE_CAM_CONFIG_STEP1, NULL,NULL); return TRUE; } /************************************************************************************************** 函 数 名 :DoubleCameraConfigStep2ProcThread 功能描述 :双相机标定:外参标定 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL IDPMSManager::DoubleCameraConfigStep2ProcThread(CWnd* pOwner, LPCTSTR szEquipTypeCode, LPCTSTR szEquipCode) { //创建Thread 先挂起 CameraTaskThread *pCameraTask = (CameraTaskThread*) AfxBeginThread( RUNTIME_CLASS(CameraTaskThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); pCameraTask->SetOwner(pOwner); pCameraTask->SetEquipTypeCode(szEquipTypeCode); pCameraTask->m_bAutoDelete = FALSE; pCameraTask->SetEquipCode(szEquipCode); pCameraTask->ResumeThread(); pCameraTask->PostThreadMessage(WM_DOUBLE_CAM_CONFIG_STEP2, NULL,NULL); return TRUE; }