음...
먼저 3초마다 반복해서 호출할것이라면
Thread를 이용해서 한번만 CreateProcess해서 route.exe를 실행한후에
필요할때마다 Command를 tx 해서 받아오는것도 한 방법일듯 합니다.
그것 그렇구
보통 프로그램이 일정시간동안 잘 돌아가다가 죽는 경우는
1. 메모리가 어디 새거나..
2. 핸들이 계속 증가 하거나 하는 경우가 대부분이죠
그것을 쉽게 확인하는 방법은
1. 작업관리자를 띄워서요
2. 작업관리자->보기->열선택 에서 "메모리 사용" 과 "핸들" ,"쓰레드" 등을 체크해보세요
3. 그런다음 프로그램을 띄워놓고 해당항목의 변화를 지켜보세요
님의 프로그램을 보니... "핸들"이 한번 Timer가 호출될때마다 2개씩 증가하네요
그렇다면 Handle을 열고난뒤에 닫지 않은 핸들이 있다는것인데...
코드를 한줄씩 디버깅하면서 실행해 보면
핸들이 증가하는데는 CreatePipe 와 CreateProcess 두군데서 2개씩 증가하여 총 4개가 증가하네요
그런데 CloseHandle을 2군데 뿐이네요
그렇다면 닫지 않은 핸들이 무엇일까요?
CreatePipe로 생성한 핸들 hread , hwrite 두개는 CloseHandle 했구요
나머지 두개는 바로..
PROCESS_INFORMATION 구조체에 있습니다.
구조체를 보면 다음과 같이 선언되어있습니다.
ypedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
위 구조체를 보면 hProcess와 hThread가 HANDLE로 선언되어 있는것을 확인할 수 있을 것입니다.
그러므로 님께서 닫지 않은 핸들은 바로
hProcess와 hThread 두개이네요
코드 맨마지막에
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
해주면 문제가 해결 될듯..
그럼..
번외편 님이 쓰신 글 :
: 네이버에 찾아보니깐 virus 나 다른것들 때문에 오류가 난다고 하는데...
: 혹시나 몰라 한번 여쭤봅니다. 소스중에 이상한부분이나 잘못쓰고 있는점 있으면 지적해주세요
: 타이머로 3초마다 한번씩 실행시키는데 어느정도(2,3시간?) 켜노면
: 응용프로그램 오류가 뜨네요..
:
: void __fastcall TForm1::Timer9Timer(TObject *Sender)
: {
: int i,j;
: bool flag;
: HANDLE hwrite, hread;
: SECURITY_ATTRIBUTES sa;
: sa.nLength = sizeof(SECURITY_ATTRIBUTES);
: sa.lpSecurityDescriptor = NULL;
: sa.bInheritHandle = true;
:
: flag = CreatePipe(&hread, &hwrite, &sa, 0);
:
: STARTUPINFO si;
: memset(&si, 0, sizeof(STARTUPINFO));
: si.cb = sizeof(STARTUPINFO);
: si.dwFlags = STARTF_USESTDHANDLES;
: si.hStdOutput = hwrite;
: si.hStdError = hwrite;
: PROCESS_INFORMATION pi;
:
: flag = CreateProcess(NULL, "route print", NULL, NULL,True, DETACHED_PROCESS,
: NULL, NULL, &si, &pi);
:
: CloseHandle(hwrite);
:
: char buffer[512];
: DWORD BytesRead;
: AnsiString ResultString;
: char IP_Gateway[30];
: int IP_Index;
: while(ReadFile(hread, buffer, sizeof(buffer)-1, &BytesRead, NULL) && BytesRead)
: {
: buffer[BytesRead] = '\0';
: ResultString = ResultString + buffer;
: }
: CloseHandle(hread);
: IP_Index = ResultString.AnsiPos("Default Gateway:");
: memcpy(IP_Gateway,&ResultString[IP_Index+22],30);
: j=3;
: for( i=0;i<30;i++)
: {
: if(IP_Gateway[i] == '.' )
: {
: j--;
: }
:
: if( j == 0 )
: {
: j = i +1 ;
: break ;
: }
: }
: memset(&IP_Gateway[j],0,(30 - j) );
:
: if(strstr(Label8->Caption.c_str(),IP_Gateway)!=NULL)
: {
: Network = 1;
: }
: else if(strstr(Label9->Caption.c_str(),IP_Gateway)!=NULL)
: {
: Network = 2;
: }
: else if(strstr(Label10->Caption.c_str(),IP_Gateway)!=NULL)
: {
: Network = 3;
: }
: else if(strstr(Label11->Caption.c_str(),IP_Gateway)!=NULL)
: {
: Network = 4;
: }
: else
: {
: Network = 0;
: }
: }