서버 프로그램이나 죽으면 안되는 프로그램일 때 쓰는 중요한 프로그램 인것 같아 보탭니다
만드신 정도의 기능이라면 굳이 별도로 watchdog을 하실 필요 없습니다. 완전히 죽어 없어진걸 체크하는데요 (윈도우가 사라졌다는건 완전히 소멸됐다는것 즉, 행업상태는 아니란 얘기) 완전히 죽어 없어지면 파괴자가 호출됩니다. 거기에
AnsiString sfname="\""+ParamStr(0)+"\"";
ShellExecute(0, "open", sfname.c_str(), "", "", SW_SHOWNORMAL);
이런코드정도면 혼자 살아납니다.
왓치독을 만들어 행업상태까지 체크한다하면 CreateProcess로 실행시키고 WaitSingleObject등으로 프로그램종료를 확인할 수있습니다. 이역시 종료된것만 확인가능하구요 파라메터로 INFINITE 를 넣으면 10초마다 한번씩 상태체크하는 불필요한 행동도 하지 않게 되겠네요 행업은 Wait과 IsHungAppWindow 를 이용해서 확인하시면 될 것 같네요 체크해서 행업상태면 KillProcess 시키면 되구요
왓치독에도 저 위에 코드를 넣어서 왓치독 차체가 죽어 없어지는 것도 방지하시면 되겠네요 이 정도 기능에 왓치독이 행업된다면..신의가호가~~
WinExec는 결국 CreateProcess를 호출합니다. 따라서 다른곳에서 잘 실행된다면 꼭 뭐가 문제가 있어 안되는게 아닐것 같네요.
중복실행방지로 WinExec가 죽어있는 어플이 없어질때까지 기다리는건 아닐지 몇가지 테스트해보시면 금방 해결하실 듯요 이미 해결하셨거나..
시간이 남으니 말이 길어지네요 ㅜ
땅주인 님이 쓰신 글 :
: 개발환경: 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);
: }
: }
:
: 어떻게 해야 할 지?
:
: