|
임펠리테리입니다.
두개의 프로그램을 동시에 실행시킨다고 생각하시기 보다는, 하나의 프로그램을 실행시키면 그넘이 실행될 때
자동으로 다른쪽을 실행시키도록 하면 되죠.
그러면, 실제 동작프로그램과 모니터 프로그램 두개가 생기게 되겠죠? 그럼 어느넘이 어느넘을 실행시키느냐
하는 선택의 문제가 남게 되겠는데, 모니터가 실제 프로그램을 실행시키도록 하는 것이 나을 겁니다.
왜냐하면, 모니터가 실제 프로그램을 감시하고 있다가 죽었다고 판단하면 그넘을 TerminateProcess()로 없애야
할텐데, 그때 프로세스핸들이 필요하기 때문입니다. 물론 프로세스 핸들은 다른 방법으로, 현재 실행중인 프로그램
중에서 찾아낼 수도 있지만, 모니터가 실제 프로그램을 CreateProcess() 함수로 실행시키면 프로세스핸들을
돌려받을 수 있으므로 일이 간단해지지요. 그리고 어차피 프로그램이 죽으면 모니터가 다시 실행시켜줘야
하기도 하구요.
프로그램간에 메시지를 주고 받는 문제는..
먼저 모니터 프로그램에서 실제 프로그램 쪽으로 메시지를 날립니다.
유니크한 메시지여야 하므로, 새 메시지를 정의하는 것이 좋겠습니다.
#define WM_QUERYRUNNING (WM_USER + 0x3000) // 모니터에서 프로그램쪽으로, "너 지금 잘 실행되고 있니?"
#define WM_OKRUNNING (WM_USER + 0x3001) // 프로그램에서 모니터로, "당근이쥐! 나 열씨미 일하고 이써~!"
물론 실제 프로그램의 메인윈도우 핸들을 찾아서 그리로 보내야지요.
그러면 실제 프로그램 쪽에서도 이 두가지 메시지를 정의해놓고, WM_QUERYRUNNING 메시지를 검출할 수 있도록 메시지맵을 작성합니다.
메시지맵의 핸들러에서 해야 할 일은 단 한가지, 무조건 모니터의 메인 윈도우로 WM_OKRUNNING 메시지를
날리면 되겠죠. 이걸 모니터에서 인식해야 하므로 WM_OKRUNNING 메시지에 대한 메시지맵을 작성하고 핸들러에선
인식하면 되는 겁니다. 그럼 죽었을 때는? 메시지를 날렸는데 일정시간 동안 응답이 없는지 알아보기 위해
타임아웃이 필요합니다. 타이머 하나를 올리면 되겠네요.
모니터 측의 타이머에 대해서는.. 이렇게 하면 되겠군요.
타이머는 두개가 필요하겠군요. 하나는 일정시간마다 메시지를 보내기 위해, 또 하나는 타임아웃을 체크하기
위해 필요하겠네요. 타임아웃을 체크하기 위한 넘은 Enabled를 false로 설정해서 안돌아가게 해놓구요.
예를 들어, 체크하는 시간을 20초로 정했다고 합시다. 그러면, 20초마다 메시지를 보내고, 보낸 직후에
타임아웃 타이머의 Enabled를 true로 설정해서 동작을 시작하도록 하구요. 이때 인터벌은 20초가 안되어야
하겠지요? 15초~18초 정도가 좋겠군요.
그리고 프로그램쪽에서 메시지로 응답이 오면 타임아웃 타이머의 Enabled를 다시 false로 돌려놓습니다.
만약 15~18초 내에 응답이 안오면 타임아웃 타이머의 OnTimer 핸들러가 실행되겠죠?
이때 프로그램이 죽었다고 판단하면 되겠네요. 프로그램을 죽이고, 다시 실행시키는 거죠.
그냥 제 머릿속의 코딩 시나리오였습니다. 코딩할 때 제가 생각하는 방식이 이렇게 중구난방이랍니다.
(창피해라... 쩝~)
그럼 이만...
왕골 님이 쓰신 글 :
: 임프님 감사합니다.
:
: 정확한 질문은 다시 한번 상황을 지켜본 다음에 나중에 다시 질문드리기로 하구요. 우선 임프님께서
: 말씀하신 내용 중 한가지에 대해서 여쭙사옵니다.
:
: 응답없음 상태의 프로그램을 감시하는 프로그램을 어떻게 만드는 건지 즉, 다른 두개의 독립된 프로그램을 어떻게 동시에 작동시키는지 하구요 그리고 감시를 할려면 다른 프로그램하고 메시지를 주고받고 해야 하는데 어떤방식으로 하는지 간략하게 설명해 주시면 고맙겠습니다.
:
: 프로그램 초보라서(특히 윈도우) 개념이 없어서.....
:
: 감사합니다.
:
: /******************************************************************/
:
: 박지훈.임프 님이 쓰신 글 :
: : 임펠리테리입니다.
: :
: : 답답하신 심정은 짐작하겠습니다만.. "죽게되는 상황" 이라는 것이 구체적으로 어떤 것인지를 알아야 하겠는데요.
: : 프로그램이 "죽는다"고 말하는 경우는, 응답없음 상태 아니면 비정상적인 종료 둘 중의 하나를 말씀하시는 것 같은데요.
: : 원래 기본적으로는, 두가지 경우 모두 프로그램의 로직상의 문제로 발생하게 되는 것이 당연하겠지요.
: : 당근하게 가장 좋은 해결책은 로직을 개선하여 죽지 않게 하는 거구요. 비정상 종료의 경우는 100% 원인을
: : 찾아내서 미리 방지하는 것이 가능합니다.
: :
: : 만약, 프로그램이 응답없음 상태가 되고 원인을 찾아내기가 너무 힘들 경우.. 어이하겠습니까. 감시 프로그램을 쓰는 것이 방법이 되겠네요.
: : 응답없음 상태라는 것은 메시지에 대해 응답하지 않는다는 것입니다. 그러므로 이 프로그램을 감시하는
: : 프로그램을 하나 만들어서, 일정시간마다 메시지를 보내고 다시 그 응답으로 받아서 프로그램이 제대로 동작하고
: : 있음을 알아낼 수 있겠습니다. api함수 TerminateProcess()를 쓰면 강제 종료가 될 겁니다.
: : 일정시간은, 겨우 메시지 하나를 주고받는 일뿐이므로 자주 해도 되겠네요. 필요하다면 1초에 한번씩 하더라도
: : 프로그램 자체의 퍼포먼스에는 그대지 지장이 없을 겁니다.
: :
: : 하지만 정말 최악의 방법이겠구요. "죽는다"고 한 내용을 구체적으로 알려주세요.
: : 제 경험으로는 고칠 수 없는 경우는 없었습니다.
: :
: : 그럼 참고하시길...
: :
: :
: : 왕골 님이 쓰신 글 :
: : : 질문이 너무 애매하게 되어서 죄송합니다.
: : : 어떻게 표현할 방법이 없어서....
: : :
: : : 질문하고자 하는 것은 대형 프레스를 작동시키는 프로그램을 짜는 사람인데요.
: : : 잘 진행이 되다가 어떤이유로 해서 Application이 죽게(?) 되면 프로그램을 따라서 제어가 안되고 이놈의 프레스가 계속 현재의 작업을 진행하게 되어 아주 위험한 상황이 됩니다.(생명이 위험함)
: : :
: : : 그래서 위의 경우가 될때 프레스의 작동을 중지시키는 어떤 액션을 취해야 하는데 현재 죽은 main application 이외에 다른 application을 작동시키거나 아니면 thread를 쓰면 해결될 듯 한데 좋은 방법이
: : : 없는지요?
: : :
: : : 고수님들의 조언을 부탁드립니다.
: : :
|