C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[71297] Re:Re:[질문] WinExec()로 외부 프로그램 실행시킬 때 잠깐동안 Hang up되는데..
땅주인 [heaven2] 4188 읽음    2014-05-13 11:34
답변 감사합니다.

모니터링 하고 있는 프로그램을 다시 실행하는 것은 별 문제가 없는데,
다시 실행시키면서 WatchDog 자신이 몇 초 동안 Hang up 되는 게 문제구요..
완전히 Hangup되는 것도 아니고 5~10초 정도 있다가 다시 정상 상태로 되돌아 옵니다 .
증상으로 보았을 때 WinExec()하면서 저런 상태로 잠깐 빠지는 것 같은데..

Watchdog이 KillProcess 로 모니터링하는 프로그램을 죽인 후 바로 실행하는 것도 아니고,
어느 정도 시간을 둔 후 다시 실행시키는대도 그러네요. 모니터링 대상 프로그램은 30초마다 HeartBeat를
Watchdog에 보내고, 일정  시간 동안 HeartBeat를 받지 못하면 대상 프로그램이 Hang up된 것으로
간주하고 다시 실행하게끔 하였고,

Window Handle을 얻지 못할 때(30초동안)에도 대상 프로그램이 죽은 것으로 간주해서 다시 실행시킵니다.
죽이고 다시 실행시키고 하는 과정은 문제가 없는데... 문제는
WatchDog 자체가 대상 프로그램을 실행시키면서 몇 초동안 Hangup 상태에 빠지는 것이
문제입니다.

이래저래 더 테스트를 해보아야 하겠네요.
감사합니다.


몇줄 보탭니다 님이 쓰신 글 :
: 서버 프로그램이나 죽으면 안되는 프로그램일 때 쓰는 중요한 프로그램 인것 같아 보탭니다
:
: 만드신 정도의 기능이라면 굳이 별도로 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);
: : 	}
: : }

: :
: : 어떻게 해야 할 지?
: :
: :

+ -

관련 글 리스트
71285 [질문] WinExec()로 외부 프로그램 실행시킬 때 잠깐동안 Hang up되는데.. 땅주인 4016 2014/05/09
71294     Re:[질문] WinExec()로 외부 프로그램 실행시킬 때 잠깐동안 Hang up되는데.. 몇줄 보탭니다 4129 2014/05/13
71297         Re:Re:[질문] WinExec()로 외부 프로그램 실행시킬 때 잠깐동안 Hang up되는데.. 땅주인 4188 2014/05/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.