|
문제가 되서 실행이 안되셨다면, 자식 실행 파일의 핸들이 없지 않을까 생각되네요..
우선, CreateProcess 로 만든 프로세스를 아래와 같이 Kill 시키실 수 있습니다.
>> TerminateProcess(piParam.hProcess, -1);
타이머를 써서 체크를 하시는 것보다, 아래와 같이 하시는 것은 어떨까 생각되네요.
void __fastcall TForm1::CreateCommand(String stCommand)
{
HWND hdWindow;
STARTUPINFO siParam;
PROCESS_INFORMATION piParam;
DWORD dwExitCode;
int itStartTime;
// 초기화
FillMemory(&siParam, sizeof(STARTUPINFO), 0);
FillMemory(&piParam, sizeof(PROCESS_INFORMATION), 0);
// Param 섯팅
siParam.cb = sizeof(STARTUPINFO);
siParam.dwFlags = STARTF_USESHOWWINDOW;
siParam.wShowWindow = SW_SHOW;
CreateProcess(NULL, stCommand.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &siParam, &piParam);
WaitForInputIdle(GetCurrentProcess(), INFINITE);
// 프로세스가 종료될때까지 대기함
if(piParam.hProcess) {
dwExitCode = STILL_ACTIVE;
itStartTime = time(0); // 시작 시간
while(dwExitCode == STILL_ACTIVE) {
WaitForSingleObject(piParam.hProcess, 1000);
GetExitCodeProcess(piParam.hProcess, &dwExitCode);
UpdateWindow(Handle);
if(time(0) - itStartTime > 30) { // 30초가 되면 강제로 끔
TerminateProcess(piParam.hProcess, -1);
break;
}
}
}
}
박경진 님이 쓰신 글 :
: 하나의 프로그램이 1분마다 여러 실행파일을 실행시킵니다.
: 그런데...
: 하나의 실행파일이 실행중에 문제가 생기면 Holding 상태에로 멈추게 되면서
: 다음에 줄줄이 실행되야할 실행파일들이 실행되지 못하는 경우가 종종 생깁니다.
: 타이머를 써서 30초 이상이 경과하면 현재 실행중인 파일을 KILL하고 싶은데요....
: 어떻게 해야 하나요....
: 현재 실행은 다음과 같이 하고 있습니다.
:
: =============================================================================================
: void __fastcall Timer1Timer(TObject *Sender)
: {
: StartProcess("bin\\aaaa.exe");
: StartProcess("bin\\bbbb.exe");
: }
:
:
: void StartProcess(AnsiString Str)
: {
: AnsiString curDir = Str;
:
: STARTUPINFO siParam;
: PROCESS_INFORMATION piParam;
: DWORD dwExitCode;
:
:
: // 초기화
: FillMemory(&siParam, sizeof(STARTUPINFO), 0);
: FillMemory(&piParam, sizeof(PROCESS_INFORMATION), 0);
:
: // Param 섯팅
: siParam.cb = sizeof(STARTUPINFO);
: siParam.dwFlags = STARTF_USESHOWWINDOW;
: siParam.wShowWindow = SW_HIDE;
:
: CreateProcess(NULL, curDir.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &siParam, &piParam);
: WaitForInputIdle(GetCurrentProcess(), INFINITE);
:
: // 프로세스가 종료될때까지 대기함
: if(piParam.hProcess) {
: dwExitCode = STILL_ACTIVE;
:
:
: while(dwExitCode == STILL_ACTIVE) {
: WaitForSingleObject(piParam.hProcess, 100);
: GetExitCodeProcess(piParam.hProcess, &dwExitCode);
: UpdateWindow(Handle);
: }
: }
: }
: ============================================================================================
|