단단한돌 님이 쓰신 글 :
: 환경: C++ Builder XE2
:
: CreateProcess()함수를 이용해 콘솔 프로그램을 실행 시킵니다.
: 그런데,
: 실행 시킬 때마다 작업관리자에서 보면 핸들이 지속적으로 증가합니다.
: 156 => 158 => 160 => ...
: 왜 이런 증상이 발생하나요?
: 24시간 운영되는 S/W라 리소스 소모에 민감하네요.
:
: 고수님들~!
: 미리 감사합니다.
:
:
void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: bool flag;
: STARTUPINFO si;
: memset(&si, 0, sizeof(STARTUPINFO));
: si.cb = sizeof(STARTUPINFO);
: si.dwFlags = STARTF_USESTDHANDLES;
: PROCESS_INFORMATION pi;
:
: UnicodeString Dir = GetCurrentDir();
: UnicodeString File = "abcd.exe";
: UnicodeString x = Dir + "\\" + File + " D:\\201807200120.adx";
: AnsiString xx = x;
:
: flag = CreateProcess(NULL,x.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
:
: if(!flag) {
: ShowMessage("Fail to create process.");
: } else {
: ShowMessage("Executed..");
: }
: }
:
답변:
OS 기초적인 부분인데...
프로세스를 생성했으니 당연히 프로세스 핸들이 열리게 되고...
모든 프로세스는 프로그램 실행을 위해 적어도 하나 이상의 쓰레드는 기본적으로 갖게 되잖아요.
아래와 같이 사용하지 않는 프로세스 핸들과 쓰레드 핸들을 닫아주면 됍니다.
...
flag = CreateProcess(NULL,x.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if(!flag) {
OutputDebugStringA("Fail to create process.");
} else {
OutputDebugStringA("Executed..");
// wait for process to terminate
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
...