개발환경: C++ Builder XE5
일종의 WatchDog을 만들었는데요..
해당 프로세서를 쳐다 보다가 없어지면 다시 실행시키는.. 서버 프로그램이나
죽으면 안되는 프로그램일 때 쓰는 보조 유틸리티..
잘 동작은 하는데요..
WinExec()로 실행시킬 때 WatchDog 프로그램 자체가 5~10초 정도 Hangup되어 버립니다.
죽었나 했더니 시간이 지나니 그냥 정상으로 돌아오구요..
개발 PC에는 그런 증상이 나타나지 않는데, 테스트 PC와 비교할 때
개발 PC는 계정 자체가 Administrator 계정이고, 테스트 PC는 그냥 관리자 권한을 가지고 있는 계정입니다. 패스워드도 없구요.
권한 문제인 지 모르겠네요. XP에서도 괜찮구요.. Win7에서 Hang up 되는 증상이 있네요.
10초 타이머로 해당 프로세서의 윈도우 핸들을 얻을 수 있는 지 계속 쳐다보다가 몇 번(3번)을 계속 얻지 못하면
프로세서가 죽은 것으로 판정하고 WinExec로 해당 프로그램을 실행시켜 버립니다. 실행되는 프로그램은
Mutex로 중복 실행되는 것을 방지했구요.
코드를 보면 아래와 같은데.. 문제될만한 것이 있는 지?
혹시나 타이머 이벤트에서 이러한 코드가 들어있어서 인 지?
// Timer Event ( 10 Second )
if ( !theEnv.m_sWindowTitle1.IsEmpty() ) {
hHandle = ::FindWindow(NULL, theEnv.m_sWindowTitle1.c_str());
if ( hHandle == NULL ) {
m_iCnt1++;
if ( m_iCnt1 > 2 ) {
AnsiString sFile = theEnv.m_sExecuteFile1;
int iResult = ::WinExec(sFile.c_str(), SW_SHOW); // 여기서 한참 Hang up 됨(5~10초 후 정상으로 돌아옴)
ShowResult(iResult, theEnv.m_sExecuteFile1);
m_iCnt1 = 0;
} else {
LogMessage(theEnv.m_sExecuteFile1 + " is not found.." + IntToStr(m_iCnt1));
}
} else {
LogMessage(theEnv.m_sExecuteFile1 + " is running..", false);
}
}
어떻게 해야 할 지?
|