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
[54760] Re:장시간 켜노니깐 응용프로그램 오류가 나는데 소스 어떤부분이 이상한지좀 봐주세요..
장성호 [nasilso] 1679 읽음    2008-10-05 01:45
음...

먼저 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;
:         }       
: }

+ -

관련 글 리스트
54749 장시간 켜노니깐 응용프로그램 오류가 나는데 소스 어떤부분이 이상한지좀 봐주세요.. 번외편 1156 2008/10/03
54760     Re:장시간 켜노니깐 응용프로그램 오류가 나는데 소스 어떤부분이 이상한지좀 봐주세요.. 장성호 1679 2008/10/05
54801         감사합니다 ^^ 번외편 1267 2008/10/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.