void CTunerCtrl::CloseExe(DWORD PID) { wstring pipeName = L""; wstring waitEventName = L""; Format(pipeName, L"%s%d", CMD2_VIEW_CTRL_PIPE, PID ); Format(waitEventName, L"%s%d", CMD2_VIEW_CTRL_WAIT_CONNECT, PID ); cmdSend.SetPipeSetting(waitEventName, pipeName); BOOL bFind = TRUE; DWORD dwCount=0; bFind = _FindOpenExeProcess(PID); if( bFind == TRUE ){ cmdSend.SendViewAppClose(); } while(bFind == TRUE && dwCount<60){ bFind = _FindOpenExeProcess(PID); Sleep(500); dwCount++; } if( bFind == TRUE ){ //ぶち殺す HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, PID); TerminateProcess(hProcess, (UINT)-1); CloseHandle(hProcess); Sleep(500); } }
UINT WINAPI CNotifyManager::SendNotifyThread(LPVOID param) { CNotifyManager* sys = (CNotifyManager*)param; CSendCtrlCmd sendCtrl; map<DWORD,DWORD>::iterator itr; DWORD wait = 0; while(1){ map<DWORD, DWORD> registGUI; map<wstring, REGIST_TCP_INFO> registTCP; NOTIFY_SRV_INFO notifyInfo; if( ::WaitForSingleObject(sys->notifyStopEvent, wait) != WAIT_TIMEOUT ){ //キャンセルされた break; } //現在の情報取得 if( sys->NotifyLock() == FALSE ) return 0; registGUI = sys->registGUIMap; registTCP = sys->registTCPMap; if( sys->notifyList.size() > 0 ){ notifyInfo = sys->notifyList[0]; sys->notifyList.erase(sys->notifyList.begin()); }else{ //リストないので終了 sys->NotifyUnLock(); return 0; } sys->NotifyUnLock(); vector<DWORD> errID; for( itr = registGUI.begin(); itr != registGUI.end(); itr++){ if( ::WaitForSingleObject(sys->notifyStopEvent, 0) != WAIT_TIMEOUT ){ //キャンセルされた break; } if( _FindOpenExeProcess(itr->first) == TRUE ){ wstring pipe; wstring waitEvent; Format(pipe, L"%s%d", CMD2_GUI_CTRL_PIPE, itr->first); Format(waitEvent, L"%s%d", CMD2_GUI_CTRL_WAIT_CONNECT, itr->first); sendCtrl.SetSendMode(FALSE); sendCtrl.SetPipeSetting(waitEvent, pipe); sendCtrl.SetConnectTimeOut(5*1000); DWORD err = sendCtrl.SendGUINotifyInfo2(¬ifyInfo); if( err == CMD_NON_SUPPORT ){ switch(notifyInfo.notifyID){ case NOTIFY_UPDATE_EPGDATA: err = sendCtrl.SendGUIUpdateEpgData(); break; case NOTIFY_UPDATE_RESERVE_INFO: case NOTIFY_UPDATE_REC_INFO: case NOTIFY_UPDATE_AUTOADD_EPG: case NOTIFY_UPDATE_AUTOADD_MANUAL: err = sendCtrl.SendGUIUpdateReserve(); break; case NOTIFY_UPDATE_SRV_STATUS: err = sendCtrl.SendGUIStatusChg((WORD)notifyInfo.param1); break; default: break; } } if( err != CMD_SUCCESS && err != CMD_NON_SUPPORT){ errID.push_back(itr->first); } }else{ errID.push_back(itr->first); } } map<wstring, REGIST_TCP_INFO>::iterator itrTCP; vector<wstring> errIP; for( itrTCP = registTCP.begin(); itrTCP != registTCP.end(); itrTCP++){ if( ::WaitForSingleObject(sys->notifyStopEvent, 0) != WAIT_TIMEOUT ){ //キャンセルされた break; } sendCtrl.SetSendMode(TRUE); sendCtrl.SetNWSetting(itrTCP->second.ip, itrTCP->second.port); sendCtrl.SetConnectTimeOut(5*1000); DWORD err = sendCtrl.SendGUINotifyInfo2(¬ifyInfo); if( err == CMD_NON_SUPPORT ){ switch(notifyInfo.notifyID){ case NOTIFY_UPDATE_EPGDATA: err = sendCtrl.SendGUIUpdateEpgData(); break; case NOTIFY_UPDATE_RESERVE_INFO: case NOTIFY_UPDATE_REC_INFO: case NOTIFY_UPDATE_AUTOADD_EPG: case NOTIFY_UPDATE_AUTOADD_MANUAL: err = sendCtrl.SendGUIUpdateReserve(); break; case NOTIFY_UPDATE_SRV_STATUS: err = sendCtrl.SendGUIStatusChg((WORD)notifyInfo.param1); break; default: break; } } if( err != CMD_SUCCESS && err != CMD_NON_SUPPORT){ errIP.push_back(itrTCP->first); } } //送信できなかったもの削除 if( sys->NotifyLock() == FALSE ) return 0; if( notifyInfo.notifyID <= 100 ){ wait = 0; }else{ wait = 0; if( sys->notifyList.size() > 0 ){ if( sys->notifyList[0].notifyID > 100 ){ wait = 5*1000; } } } for( size_t i=0; i<errID.size(); i++ ){ itr = sys->registGUIMap.find(errID[i]); if( itr != sys->registGUIMap.end() ){ sys->registGUIMap.erase(itr); } } for( size_t i=0; i<errIP.size(); i++ ){ itrTCP = sys->registTCPMap.find(errIP[i]); if( itrTCP != sys->registTCPMap.end() ){ _OutputDebugString(L"notifyErr %s:%d", itrTCP->second.ip.c_str(), itrTCP->second.port); sys->registTCPMap.erase(itrTCP); } } sys->NotifyUnLock(); } return 0; }
UINT WINAPI CBatManager::BatWorkThread(LPVOID param) { CBatManager* sys = (CBatManager*)param; CSendCtrlCmd sendCtrl; while(1){ if( ::WaitForSingleObject(sys->batWorkStopEvent, 1000) != WAIT_TIMEOUT ){ //キャンセルされた break; } if( sys->workFlag == TRUE ){ BAT_WORK_INFO work; if( sys->Lock() == TRUE ){ if( sys->workList.size() == 0 ){ sys->UnLock(); break; }else{ work = sys->workList[0]; } }else{ continue; } sys->UnLock(); if( work.reserveInfo.recSetting.batFilePath.size() > 0 ){ wstring batFilePath = L""; if( sys->CreateBatFile(&work, work.reserveInfo.recSetting.batFilePath, batFilePath) == TRUE ){ wstring strExecute; Format(strExecute, L"\"%s\"", batFilePath.c_str()); BOOL send = FALSE; DWORD PID = 0; map<DWORD, DWORD>::iterator itr; map<DWORD, DWORD> registGUIMap; if( sys->notifyManager != NULL ){ sys->notifyManager->GetRegistGUI(®istGUIMap); } for( itr = registGUIMap.begin(); itr != registGUIMap.end(); itr++ ){ wstring pipeName = L""; wstring waitEventName = L""; Format(pipeName, L"%s%d", CMD2_GUI_CTRL_PIPE, itr->first ); Format(waitEventName, L"%s%d", CMD2_GUI_CTRL_WAIT_CONNECT, itr->first ); sendCtrl.SetPipeSetting(waitEventName, pipeName); if( sendCtrl.SendGUIExecute(strExecute.c_str(), &PID) == CMD_SUCCESS ){ send = TRUE; break; } } if( send == FALSE ){ //GUI経由で起動できなかった PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si); send = CreateProcess( NULL, (WCHAR*)strExecute.c_str(), NULL, NULL, FALSE, GetPriorityClass(GetCurrentProcess()), NULL, NULL, &si, &pi ); if( send == TRUE ){ CloseHandle(pi.hThread); CloseHandle(pi.hProcess); PID = pi.dwProcessId; } } if( send == TRUE ){ //終了監視 while(1){ if( WaitForSingleObject( sys->batWorkStopEvent, 2000 ) != WAIT_TIMEOUT ){ //中止 break; } if( _FindOpenExeProcess(PID) == FALSE ){ //終わった sys->lastSuspendMode = work.reserveInfo.recSetting.suspendMode; sys->lastRebootFlag = work.reserveInfo.recSetting.rebootFlag; break; } } } }else{ _OutputDebugString(L"BATファイル作成エラー:%s", work.reserveInfo.recSetting.batFilePath); } } if( sys->Lock() == TRUE ){ sys->workList.erase(sys->workList.begin()); sys->UnLock(); } } } sys->workFlag = FALSE; return 0; }