// CDialManageLoopTask.cpp : 实现文件 // #include "stdafx.h" #include "GeoMative.h" #include "DialManageLoopTask.h" #include "afxdialogex.h" #include "Lock\AutoLock.h" #include "FileOperTools.h" // DialManageLoopTask 对话框 extern int g_iUILanguage; extern CGeoMativeApp theApp; extern CString Tm2LocalStr(time_t t); extern float tcp_ntohf(float f); extern CString Tm2GmtStr(time_t t); extern int g_iTimeZone; extern char* U2G(const char* utf8); extern time_t Str2GmtTm(CString szTime); #define MODULE_NAME "CDialManageLoopTask" IMPLEMENT_DYNAMIC(CDialManageLoopTask, CNetRequestDialog) CDialManageLoopTask::CDialManageLoopTask(CWnd* pParent /*=NULL*/) : CNetRequestDialog(CDialManageLoopTask::IDD, pParent) { InitializeCriticalSection(&m_cs); } CDialManageLoopTask::~CDialManageLoopTask() { DeleteCriticalSection(&m_cs); } void CDialManageLoopTask::DoDataExchange(CDataExchange* pDX) { CNetRequestDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_LOOP_TASK_LIST, m_LoopTaskList); DDX_Control(pDX, IDC_LIST_SUBTASK_LIST, m_subtaskList); DDX_Control(pDX, IDC_EDIT_LOOP_TASK_NAME, m_editLoopTaskName); DDX_Control(pDX, IDC_EDIT_PLC_ID, m_editPLCID); DDX_Control(pDX, IDC_EDIT_GD10_ID, m_editGDID); DDX_Control(pDX, IDC_EDIT_LOOP_TYPE, m_editLoopType); DDX_Control(pDX, IDC_EDIT_LOOP_COUNT, m_editLoopCount); DDX_Control(pDX, IDC_EDIT_TIMER_TYPE, m_editTimerType); DDX_Control(pDX, IDC_EDIT_START_TIME, m_editStartTime); DDX_Control(pDX, IDC_EDIT_END_TIME, m_editEndTime); DDX_Control(pDX, IDC_EDIT_EVERYDAY_START_TIME, m_editEverydayStartTime); DDX_Control(pDX, IDC_EDIT_TASK_INTERVAL, m_editTaskInterval); } BEGIN_MESSAGE_MAP(CDialManageLoopTask, CNetRequestDialog) ON_BN_CLICKED(ID_BTN_DELETE_LOOP_TASK, &CDialManageLoopTask::OnBnClickedBtnDeleteLoopTask) ON_BN_CLICKED(IDOK, &CDialManageLoopTask::OnBnClickedOk) ON_NOTIFY(NM_CLICK, IDC_LIST_LOOP_TASK_LIST, &CDialManageLoopTask::OnNMClickListLoopTaskList) //ON_MESSAGE(WM_GET_TASK_LIST_MSG, OnGetSubListMsg) END_MESSAGE_MAP() // CDialManageLoopTask 消息处理程序 BOOL CDialManageLoopTask::OnInitDialog() { CNetRequestDialog::OnInitDialog(); CRect rcList; m_LoopTaskList.GetClientRect(&rcList); m_LoopTaskList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_ONECLICKACTIVATE | LVS_EX_GRIDLINES); int width = rcList.right - rcList.left; int iColIndex = (int)VAL_ZERO; int iColumnNum = 5; if (LANG_ZHCN == g_iUILanguage) { m_LoopTaskList.InsertColumn(iColIndex++, _T("任务名称"), LVCFMT_LEFT, width / iColumnNum); m_LoopTaskList.InsertColumn(iColIndex++, _T("任务ID"), LVCFMT_LEFT, width / iColumnNum); m_LoopTaskList.InsertColumn(iColIndex++, _T("循环类型"), LVCFMT_LEFT, width / iColumnNum); m_LoopTaskList.InsertColumn(iColIndex++, _T("开始时间"), LVCFMT_LEFT, width / iColumnNum); m_LoopTaskList.InsertColumn(iColIndex++, _T("结束时间"), LVCFMT_LEFT, width / iColumnNum); SetWindowTextA(_T("定时任务管理")); m_strLoopTaskNumTips = _T("循环任务数: "); m_strSubloopTaskNumTips = _T("子任务数: "); GetDlgItem(IDC_STATIC_LOOP_NAME_DIS)->SetWindowText(_T("循环任务名:")); GetDlgItem(IDC_STATIC_GD10_ID)->SetWindowText(_T("主机ID:")); GetDlgItem(IDC_STATIC_LOOP_TYPE)->SetWindowText(_T("循环类型:")); GetDlgItem(IDC_STATIC_LOOP_COUNT)->SetWindowText(_T("循环次数:")); GetDlgItem(IDC_STATIC_LOOP_TIMER)->SetWindowText(_T("定时类型:")); GetDlgItem(IDC_STATIC_LOOP_START_TIME)->SetWindowText(_T("开始时间:")); GetDlgItem(IDC_STATIC_LOOP_END_TIME)->SetWindowText(_T("结束时间:")); GetDlgItem(IDC_STATIC_EVERY_TIME)->SetWindowText(_T("每天开始时间:")); GetDlgItem(IDC_STATIC_SUB_TASK_SPACE)->SetWindowText(_T("任务间隔:")); GetDlgItem(ID_BTN_DELETE_LOOP_TASK)->SetWindowTextA(_T("删除")); GetDlgItem(IDOK)->SetWindowTextA(_T("确定")); } else { m_strLoopTaskNumTips = _T("loop task number: "); m_strSubloopTaskNumTips = _T("Number of subtasks: "); m_LoopTaskList.InsertColumn(iColIndex++, _T("Task name"), LVCFMT_LEFT, width / iColumnNum); m_LoopTaskList.InsertColumn(iColIndex++, _T("Task ID"), LVCFMT_LEFT, width / iColumnNum); m_LoopTaskList.InsertColumn(iColIndex++, _T("Loop type"), LVCFMT_LEFT, width / iColumnNum); m_LoopTaskList.InsertColumn(iColIndex++, _T("Start time"), LVCFMT_LEFT, width / iColumnNum); m_LoopTaskList.InsertColumn(iColIndex++, _T("End time"), LVCFMT_LEFT, width / iColumnNum); } m_subtaskList.GetClientRect(&rcList); m_subtaskList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_ONECLICKACTIVATE | LVS_EX_GRIDLINES); width = rcList.right - rcList.left; iColIndex = (int)VAL_ZERO; iColumnNum = 4; if (LANG_ZHCN == g_iUILanguage) { m_subtaskList.InsertColumn(iColIndex++, _T("任务名称"), LVCFMT_LEFT, width / iColumnNum); m_subtaskList.InsertColumn(iColIndex++, _T("任务ID"), LVCFMT_LEFT, width / iColumnNum); m_subtaskList.InsertColumn(iColIndex++, _T("脚本名称"), LVCFMT_LEFT, width / iColumnNum); m_subtaskList.InsertColumn(iColIndex++, _T("总点数"), LVCFMT_LEFT, width / iColumnNum); } else { m_subtaskList.InsertColumn(iColIndex++, _T("task name"), LVCFMT_LEFT, width / iColumnNum); m_subtaskList.InsertColumn(iColIndex++, _T("task ID"), LVCFMT_LEFT, width / iColumnNum); m_subtaskList.InsertColumn(iColIndex++, _T("script name"), LVCFMT_LEFT, width / iColumnNum); m_subtaskList.InsertColumn(iColIndex++, _T("Total points"), LVCFMT_LEFT, width / iColumnNum); } GetDlgItem(IDC_STATIC_LOOP_TASK_NUMBER)->SetWindowTextA(m_strLoopTaskNumTips); GetDlgItem(IDC_STATIC_SUBTASK)->SetWindowTextA(m_strSubloopTaskNumTips); //初始化循环任务列表 InitLoopTaskList(); CString strTemp; strTemp.Format(_T("SN%u"), m_dwDeviceSN); m_editGDID.SetWindowTextA(strTemp); strTemp.Format(_T("PLC%u"), m_dwPLCID); m_editPLCID.SetWindowTextA(strTemp); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } void CDialManageLoopTask::OnBnClickedBtnDeleteLoopTask() { // TODO: 在此添加控件通知处理程序代码 /*while (m_LoopTaskList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED) != -1) { int nItem = m_LoopTaskList.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); m_LoopTaskList.DeleteItem(nItem); }*/ CString szListStr,strLog; char ucTaskID[MAX_NAME_LEN] = { 0 }; char chStr[200]; int iLen = 0; POSITION pos = m_LoopTaskList.GetFirstSelectedItemPosition(); if (pos == NULL) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("请先选中需要删除的任务")); else MessageBoxEx(NULL, _T("Please select the task to be deleted first!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } //theApp.m_NetWorkOper.SetSuspendForThread(true); for (int i = 0; i < m_LoopTaskList.GetItemCount(); i++) { if (m_LoopTaskList.GetItemState(i, LVNI_ALL | LVNI_SELECTED) == LVIS_SELECTED) { szListStr = m_LoopTaskList.GetItemText(i, 1); m_vtDelLoopTask.push_back(szListStr); strncpy(ucTaskID, szListStr, MAX_NAME_LEN* sizeof(BYTE)); strLog.Format(_T("[%s][%d]:delete loop task request, taskid=%s"), MODULE_NAME, __LINE__, szListStr); CFileOperTools::GetInstance()->WriteComLog(strLog); PostNetRequest(EN_CANCEL_LOOP_TASK_TRUST, this->m_hWnd, (char*)ucTaskID, MAX_NAME_LEN); } } // while (pos) // { // m_iCurItemIndex = m_LoopTaskList.GetNextSelectedItem(pos); // szListStr.Empty(); // szListStr = m_LoopTaskList.GetItemText(m_iCurItemIndex, 1); // strncpy(ucTaskID, szListStr, MAX_NAME_LEN* sizeof(BYTE)); // PostNetRequest(EN_CANCEL_LOOP_TASK_TRUST, this->m_hWnd, (char*)ucTaskID, MAX_NAME_LEN); // } //theApp.m_NetWorkOper.SetSuspendForThread(false); //清除界面数据 m_subtaskList.DeleteAllItems(); SetDlgItemText(IDC_EDIT_LOOP_TASK_NAME, _T("")); SetDlgItemText(IDC_EDIT_LOOP_TYPE, _T("")); SetDlgItemText(IDC_EDIT_START_TIME, _T("")); SetDlgItemText(IDC_EDIT_END_TIME, _T("")); SetDlgItemText(IDC_EDIT_LOOP_COUNT, _T("")); } void CDialManageLoopTask::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 CNetRequestDialog::OnOK(); } void CDialManageLoopTask::OnNMClickListLoopTaskList(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); // TODO: 在此添加控件通知处理程序代码 if (-1 != pNMItemActivate->iItem) { SetDlgItemText(IDC_EDIT_LOOP_TASK_NAME, m_LoopTaskList.GetItemText(pNMItemActivate->iItem, 0).GetBuffer()); SetDlgItemText(IDC_EDIT_TIMER_TYPE, m_LoopTaskList.GetItemText(pNMItemActivate->iItem, 2).GetBuffer()); SetDlgItemText(IDC_EDIT_START_TIME, m_LoopTaskList.GetItemText(pNMItemActivate->iItem, 3).GetBuffer()); SetDlgItemText(IDC_EDIT_END_TIME, m_LoopTaskList.GetItemText(pNMItemActivate->iItem, 4).GetBuffer()); //SetDlgItemText(IDC_EDIT_LOOP_COUNT, m_LoopTaskList.GetItemText(pNMItemActivate->iItem, 5).GetBuffer()); //更新循环子任务列表 CString strLoopTaskID = m_LoopTaskList.GetItemText(pNMItemActivate->iItem, 1); //AfxBeginThread(GetSubTaskThread, this); char szTaskID[MAX_NAME_LEN] = { 0 }; strcpy(szTaskID, strLoopTaskID.GetBuffer()); PostNetRequest(EN_REQ_DOWNLOAD_LOOP_SUB_TABLE, this->m_hWnd, szTaskID, sizeof(szTaskID), 4096); CString strLog; strLog.Format(_T("[%s][%d]: get loop task args and sub table list request,taskid=%s"), MODULE_NAME, __LINE__, szTaskID); CFileOperTools::GetInstance()->WriteComLog(strLog); } *pResult = 0; } void CDialManageLoopTask::InitLoopTaskList() { ///////////////////////////////////////////////////////同步任务列表//////////////////////////////////////////////// char chSendStr[210] = { 0 }; UINT32 uiDevID = m_dwDeviceSN; time_t tm; m_uiTotalEndTime = (int)time(&tm); m_uiTotalEndTime += 3600 * 8; m_uiTotalStartTime = m_uiTotalEndTime - 30 * 24 * 3600; //按天加载 UINT32 uiStartTime,uiEndTime; uiStartTime = m_uiTotalStartTime; uiEndTime = m_uiTotalStartTime + NUMBER_DAYS_LOAD_LOOP_LIST*24 * 3600; uiDevID = htonl(uiDevID); uiStartTime = htonl(uiStartTime); uiEndTime = htonl(uiEndTime); memcpy(chSendStr, &uiDevID, sizeof(UINT32)); memcpy(&chSendStr[sizeof(UINT32)], &uiStartTime, sizeof(UINT32)); memcpy(&chSendStr[2 * sizeof(UINT32)], &uiEndTime, sizeof(UINT32)); PostNetRequest(EN_REQ_DOWNLOAD_LOOP_TABLE, this->m_hWnd, chSendStr, 3 * sizeof(UINT32), 1500); } void CDialManageLoopTask::PreNetResponse(WPARAM wParam, LPARAM lParam) { LPRESPONSEPACKET pResponsePacket = (LPRESPONSEPACKET)lParam; if (pResponsePacket == NULL) { return; } switch (pResponsePacket->clsPacketBase.ucCmd) { case EN_CANCEL_LOOP_TASK_TRUST://删除循环任务响应 { if ((1 > pResponsePacket->wDataLen) || (EN_RECV_SUCCESS != pResponsePacket->pData[0])) { //theApp.m_NetWorkOper.SetSuspendForThread(false); return; } else { CString strLog; for (int i = 0; i < m_LoopTaskList.GetItemCount(); i++) { if (m_LoopTaskList.GetItemState(i, LVNI_ALL | LVNI_SELECTED) == LVIS_SELECTED) { CString strTaskID = m_LoopTaskList.GetItemText(i, 1); // if (strTaskID.CompareNoCase(m_vtDelItemIndex.at(0)) == 0) // { m_LoopTaskList.DeleteItem(i); m_vtDelLoopTask.pop_back();//只用于记录删除的个数,实际弹出的taskID不用管 //} if (m_vtDelLoopTask.size() <= 0) { if (g_iUILanguage == LANG_ZHCN) AfxMessageBox(_T("取消循环任务完成")); else MessageBoxEx(NULL, _T("Cancel loop task finished."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } strLog.Format(_T("[%s][%d]:Loop task List delete select Item response, taskid=%s"), MODULE_NAME, __LINE__, strTaskID); CFileOperTools::GetInstance()->WriteComLog(strLog); break; /*szListStr = m_vtDelItemIndex.push_back(szListStr); strncpy(ucTaskID, szListStr, MAX_NAME_LEN* sizeof(BYTE)); strLog.Format(_T("[%s][%d] delete loop taskid=%s"), MODULE_NAME, __LINE__, szListStr); CFileOperTools::GetInstance()->WriteComLog(); PostNetRequest(EN_CANCEL_LOOP_TASK_TRUST, this->m_hWnd, (char*)ucTaskID, MAX_NAME_LEN);*/ } } // for (int i = 0; i < m_LoopTaskList.GetItemCount(); i++) // { // m_LoopTaskList.DeleteItem(m_iCurItemIndex); // } //theApp.m_NetWorkOper.SetSuspendForThread(false); //清除界面数据 m_subtaskList.DeleteAllItems(); SetDlgItemText(IDC_EDIT_LOOP_TASK_NAME, _T("")); SetDlgItemText(IDC_EDIT_LOOP_TYPE, _T("")); SetDlgItemText(IDC_EDIT_START_TIME, _T("")); SetDlgItemText(IDC_EDIT_END_TIME, _T("")); SetDlgItemText(IDC_EDIT_LOOP_COUNT, _T("")); } } break; case EN_REQ_DOWNLOAD_LOOP_SUB_TABLE: { GetSubLoopListResponse(wParam, lParam); } break; case EN_REQ_DOWNLOAD_TASK_ARG: { UINT32 *uiRevData = (UINT32*)(pResponsePacket->pData); UINT32 uiRevDataNum = ntohl(uiRevData[0]); if ((uiRevDataNum < 1) || (pResponsePacket->wDataLen < (sizeof(UINT32) + uiRevDataNum * sizeof(STRemTaskArg)))) { //theApp.m_NetWorkOper.SetSuspendForThread(false); return; } //pThis->SendMessage(WM_GET_TASK_LIST_MSG, (WPARAM)chMsgSyn, iLen); CString str; /*if ((uiRevDataNum < 1) || (iLen < (sizeof(UINT32) + uiRevDataNum * sizeof(STRemTaskArg)))) { theApp.m_NetWorkOper.SetSuspendForThread(false); return 0; }*/ /*if (0 == m_stLoopTaskInfo.ucContrlType) { m_editLoopType.SetWindowTextA((LPCTSTR)(_bstr_t)_T("次数循环")); } else { m_editLoopType.SetWindowTextA((LPCTSTR)(_bstr_t)_T("定时循环")); } int iStartMin = m_stLoopTaskInfo.uiStartMin - 60 * g_iTimeZone; if (iStartMin < 0) { iStartMin += 24 * 60; //格林威治时间是前一天了 } if (iStartMin > 24 * 60) { iStartMin -= 24 * 60; //格林威治时间是后一天了 } str.Empty(); str.Format(_T("%2d:%2d:00"), iStartMin /60, iStartMin % 60); m_editEverydayStartTime.SetWindowTextA(str); str.Empty(); str.Format(_T("%2d:%2d:00"), m_stLoopTaskInfo.uiTaskSpace/60, m_stLoopTaskInfo.uiTaskSpace%60); m_editTaskInterval.SetWindowTextA(str); */ STRemTaskArg * ptTaskArg = (STRemTaskArg *)((char *)pResponsePacket->pData + sizeof(UINT32)); int iIndex = (int)VAL_ZERO; //m_subtaskList.DeleteAllItems(); int iExtNum = m_subtaskList.GetItemCount();//已存在的行数 str.Empty(); str.Format("%s%u", m_strSubloopTaskNumTips, iExtNum + uiRevDataNum); GetDlgItem(IDC_STATIC_SUBTASK)->SetWindowTextA(str); for (iIndex = 0; iIndex < uiRevDataNum; iIndex++) { m_subtaskList.InsertItem(iIndex + iExtNum, _T("")); m_subtaskList.SetItemText(iIndex + iExtNum, 0, U2G(ptTaskArg[iIndex].ucTDName)); m_subtaskList.SetItemText(iIndex + iExtNum, 1, ptTaskArg[iIndex].ucTaskID); m_subtaskList.SetItemText(iIndex + iExtNum, 2, U2G(ptTaskArg[iIndex].ucSciptName)); str.Empty(); str.Format("%u", ntohl(ptTaskArg[iIndex].uiTotalNum)); m_subtaskList.SetItemText(iIndex + iExtNum, 3, str); } } break; case EN_REQ_DOWNLOAD_LOOP_TABLE: { GetLoopListResponse(wParam, lParam); } break; default: break; } } void CDialManageLoopTask::GetSubLoopListResponse(WPARAM wParam, LPARAM lParam) { CString strLog; LPRESPONSEPACKET pResponsePacket = (LPRESPONSEPACKET)lParam; if (NULL == pResponsePacket || pResponsePacket->clsPacketBase.ucCmd != EN_REQ_DOWNLOAD_LOOP_SUB_TABLE) { strLog.Format(_T("[%s][%d]: NULL == pResponsePacket || pResponsePacket->clsPacketBase.ucCmd != EN_REQ_DOWNLOAD_LOOP_SUB_TABLE"), MODULE_NAME, __LINE__); CFileOperTools::GetInstance()->WriteComLog(strLog); return; } CString strTaskID; CStringArray szArrayID; STLoopTaskInfo stLoopTaskInfo; STLoopTaskInfo *pstLoopTaskInfo = &stLoopTaskInfo; char *pcTaskID = NULL; int uiSubTaskNum = 0; pstLoopTaskInfo = (STLoopTaskInfo *)pResponsePacket->pData; uiSubTaskNum = ntohl(pstLoopTaskInfo->uiSubTaskNum); if (pResponsePacket->wDataLen < (sizeof(STLoopTaskInfo) + uiSubTaskNum*sizeof(pstLoopTaskInfo->ucTaskID))) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("查看循环任务信息失败,数据长度错误")); else MessageBoxEx(NULL, _T("Failed to view loop task information, data length error."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); strLog.Format(_T("[%s][%d]: pResponsePacket->wDataLen=%d < (sizeof(STLoopTaskInfo) + uiSubTaskNum*sizeof(pstLoopTaskInfo->ucTaskID))=%d"), MODULE_NAME, __LINE__, strLog, pResponsePacket->wDataLen, sizeof(STLoopTaskInfo) + uiSubTaskNum*sizeof(pstLoopTaskInfo->ucTaskID)); CFileOperTools::GetInstance()->WriteComLog(strLog); //theApp.m_NetWorkOper.SetSuspendForThread(false); return; } // char szTaskID[MAX_NAME_LEN] = { 0 }; // if (0 != memcmp(szTaskID, pstLoopTaskInfo->ucTaskID, sizeof(pstLoopTaskInfo->ucTaskID))) // { // AfxMessageBox(_T("Synchronization loop sub task table to failed. Receiv loop task name is error.")); // //theApp.m_NetWorkOper.SetSuspendForThread(false); // return; // } //memcpy(&pThis->m_stLoopTaskInfo, &pstLoopTaskInfo, sizeof(STLoopTaskInfo));//拷贝给显示框用 //显示未显示的循环任务详细信息 CString strEverydayStartTime; CString strTaskInterval; CString strLoopNum; if (0 == pstLoopTaskInfo->ucContrlType) { if (LANG_ZHCN == g_iUILanguage) m_editLoopType.SetWindowTextA((LPCTSTR)(_bstr_t)_T("次数循环")); else m_editLoopType.SetWindowTextA((LPCTSTR)(_bstr_t)_T("Number of cycles")); } else { if (LANG_ZHCN == g_iUILanguage) m_editLoopType.SetWindowTextA((LPCTSTR)(_bstr_t)_T("定时循环")); else m_editLoopType.SetWindowTextA((LPCTSTR)(_bstr_t)_T("Timer of cycles")); } int iStartMin = ntohl(pstLoopTaskInfo->uiStartMin) + 60 * g_iTimeZone; if (iStartMin < 0) { iStartMin += 24 * 60; //格林威治时间是前一天了 } if (iStartMin > 24 * 60) { iStartMin -= 24 * 60; //格林威治时间是后一天了 } strEverydayStartTime.Format(_T("%2d:%2d:00"), iStartMin / 60, iStartMin % 60); m_editEverydayStartTime.SetWindowTextA(strEverydayStartTime); strTaskInterval.Format(_T("%2d:%2d:%2d"), ntohl(pstLoopTaskInfo->uiTaskSpace) / 60 / 60 % 60, ntohl(pstLoopTaskInfo->uiTaskSpace) / 60 % 60, ntohl(pstLoopTaskInfo->uiTaskSpace) % 60); m_editTaskInterval.SetWindowTextA(strTaskInterval); strLoopNum.Format(_T("%d/%d"),ntohs(pstLoopTaskInfo->uiRemainLoopNum), ntohs(pstLoopTaskInfo->uiLoopNum)); m_editLoopCount.SetWindowTextA(strLoopNum); //取子任务名字 pcTaskID = (char*)&pResponsePacket->pData[sizeof(STLoopTaskInfo)]; for (int j = 0; j < uiSubTaskNum; j++) { strTaskID.Empty(); char *pcTemTaskID = (char*)&pcTaskID[sizeof(char)* MAX_NAME_LEN * j]; char ucTaskId[40] = { 0 }; strncpy(ucTaskId, pcTemTaskID, sizeof(char)* MAX_NAME_LEN); //memcpy(&strTaskID, pcTaskID, sizeof(char) * 40); strTaskID += ucTaskId; szArrayID.Add(strTaskID); } //写入数据库 strLog.Format(_T("[%s][%d]: get loop task args and sub table list response,pstLoopTaskInfo->ucContrlType=%d,strEverydayStartTime=%s,strTaskInterval=%s,strLoopNum=%s"), MODULE_NAME, __LINE__, pstLoopTaskInfo->ucContrlType, strEverydayStartTime, strTaskInterval, strLoopNum); CFileOperTools::GetInstance()->WriteComLog(strLog); //查询子任务信息 //int iListIndex = m_SevTdList.GetItemCount(); GetDlgItem(IDC_STATIC_SUBTASK)->SetWindowTextA(m_strSubloopTaskNumTips); m_subtaskList.DeleteAllItems(); UINT32 uiGetTaskNum = 5;//5个任务获取一次,减少交互 UINT32 uiSubNum = htonl(uiGetTaskNum); UINT32 *uiRevData = NULL; STRemTaskArg * ptTaskArg = NULL; char chMsgSyn[2048] = { 0 }; //char szTaskID[MAX_NAME_LEN] = { 0 }; memset(chMsgSyn, 0, sizeof(chMsgSyn)); int iStartNum = 0; for (int j = 0; j < uiSubTaskNum; j++) { strncpy(&chMsgSyn[4 + (j-iStartNum)*MAX_NAME_LEN], szArrayID.GetAt(j), MAX_NAME_LEN*sizeof(BYTE)); if (j != 0 && ((j + 1) % uiGetTaskNum == 0)) { uiSubNum = uiGetTaskNum; } else if (j + 1 == uiSubTaskNum) { uiSubNum = uiSubTaskNum - iStartNum; } else { continue; } int iSendLen = sizeof(UINT32) + sizeof(BYTE)*MAX_NAME_LEN*uiSubNum; uiSubNum = htonl(uiSubNum); memcpy(chMsgSyn, &uiSubNum, sizeof(UINT32)); iStartNum = j + 1; PostNetRequest(EN_REQ_DOWNLOAD_TASK_ARG, this->m_hWnd, chMsgSyn, iSendLen); memset(chMsgSyn, 0, sizeof(chMsgSyn)); } } void CDialManageLoopTask::GetLoopListResponse(WPARAM wParam, LPARAM lParam) { LPRESPONSEPACKET pResponsePacket = (LPRESPONSEPACKET)lParam; if (pResponsePacket == NULL || pResponsePacket->clsPacketBase.ucCmd != EN_REQ_DOWNLOAD_LOOP_TABLE) { return; } STLoopTaskTable *pstLoopTask = NULL; STLoopTaskTable stLoopTask; CString strTaskID; UINT32 uiLoopTaskNum = 0; memcpy(&uiLoopTaskNum, pResponsePacket->pData, sizeof(uiLoopTaskNum)); uiLoopTaskNum = ntohl(uiLoopTaskNum); for (int i = 0; i < uiLoopTaskNum; i++) { pstLoopTask = (STLoopTaskTable*)&pResponsePacket->pData[sizeof(uiLoopTaskNum) + i*sizeof(STLoopTaskTable)]; strTaskID.Empty(); strTaskID += pstLoopTask->ucTaskID; if (strTaskID.FindOneOf("LOOP") == -1) { continue; } memcpy(stLoopTask.ucTaskID, pstLoopTask->ucTaskID, MAX_NAME_LEN); memcpy(stLoopTask.ucTaskName, pstLoopTask->ucTaskName, MAX_NAME_LEN); stLoopTask.uiStartTime = ntohl(pstLoopTask->uiStartTime); stLoopTask.uiEndTime = ntohl(pstLoopTask->uiEndTime); stLoopTask.ucLoopType = pstLoopTask->ucLoopType; m_mapSaveLoopList[pstLoopTask->ucTaskName] = stLoopTask; } char chSendStr[210] = { 0 }; UINT32 uiDevID = m_dwDeviceSN; CTime clsStart(m_uiTotalStartTime); CTime clsStop(m_uiTotalEndTime); CTimeSpan timeSpan1 = clsStop - clsStart; int iDay = timeSpan1.GetDays(); if (iDay > 1) { CTimeSpan ts(NUMBER_DAYS_LOAD_LOOP_LIST, 0, 0, 0); // 加5天 clsStart = clsStart + ts; CString date = clsStart.Format("%Y-%m-%d %H:%M:%S "); m_uiTotalStartTime = Str2GmtTm(date); time_t uiStartTime, uiEndTime; uiStartTime = m_uiTotalStartTime; uiEndTime = m_uiTotalStartTime + NUMBER_DAYS_LOAD_LOOP_LIST * 24 * 3600 + 3600;//3600预留一小时,客户端与服务器偏差时间 CString strLog; strLog.Format(_T("zm:CDialManageLoopTask::GetLoopListResponse request start time:%s,end time=%s\n"), Tm2LocalStr(uiStartTime), Tm2LocalStr(uiEndTime)); CFileOperTools::GetInstance()->WriteComLog(strLog); uiDevID = htonl(uiDevID); uiStartTime = htonl(uiStartTime); uiEndTime = htonl(uiEndTime); memcpy(chSendStr, &uiDevID, sizeof(UINT32)); memcpy(&chSendStr[sizeof(UINT32)], &uiStartTime, sizeof(UINT32)); memcpy(&chSendStr[2 * sizeof(UINT32)], &uiEndTime, sizeof(UINT32)); PostNetRequest(EN_REQ_DOWNLOAD_LOOP_TABLE, this->m_hWnd, chSendStr, 3 * sizeof(UINT32), 4096); } else { //显示循环列表 ShowLoopList(); } } void CDialManageLoopTask::ShowLoopList() { int iItemCount = m_mapSaveLoopList.size(); if (iItemCount <= 0) return; CString strTemp; UINT32 uiLoopTaskNum = 0; strTemp.Format(_T("%s%d"), m_strLoopTaskNumTips, iItemCount); GetDlgItem(IDC_STATIC_LOOP_TASK_NUMBER)->SetWindowTextA(strTemp); std::map::iterator iter = m_mapSaveLoopList.begin(); for (int i = 0; iter != m_mapSaveLoopList.end(); iter++,i++) { m_LoopTaskList.InsertItem(i, _T("")); m_LoopTaskList.SetItemText(i, 0, U2G(iter->second.ucTaskName)); m_LoopTaskList.SetItemText(i, 1, iter->second.ucTaskID); if (0 == iter->second.ucLoopType) { if (LANG_ZHCN == g_iUILanguage) m_LoopTaskList.SetItemText(i, 2, _T("次数循环")); else m_LoopTaskList.SetItemText(i, 2, _T("Number of cycles")); } else { if (LANG_ZHCN == g_iUILanguage) m_LoopTaskList.SetItemText(i, 2, _T("定时循环")); else m_LoopTaskList.SetItemText(i, 2, _T("Timer of cycles")); } strTemp = Tm2LocalStr(iter->second.uiStartTime); m_LoopTaskList.SetItemText(i, 3, (LPCTSTR)(_bstr_t)strTemp); strTemp = Tm2LocalStr(iter->second.uiEndTime); m_LoopTaskList.SetItemText(i, 4, (LPCTSTR)(_bstr_t)strTemp); } }