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
[60883] Re:Re:Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다.
장성호 [nasilso] 1393 읽음    2010-04-24 12:39
PostMessage는 메세지큐에 메세지가 쌓이기는 하지만..
반드시 다 쌓여있다가.. 나중에 순차적으로 처리할수 있는것은 아닙니다.
메세지를 못받을 수도 있습니다.

그리고 님 클래스를 볼때 ...
메모리생성과 소멸이 다른곳에 있을뿐이지 ...
같은 class내부에서 처리하는데..
굳이 메모리 주소까지 PostMessage 보낼 필요가 있으는지 의문이네요

그럼..

이길남.HoPe 님이 쓰신 글 :
: 안녕하세요. *^0^*
:
: 우선 바쁘신데 확인해 주셔서 감사합니다.
:
: 메세지로 파일을 열고 닫는건 제가 산업자동화 설비를 하는 프로그램을 합니다.
:
: 해서, 어플이 항상 켜져 있어야 됩니다. 파일을 항상 열어 놓으면 외부(탐색기등을 이용하여)에서
:
: 파일을 열거나 삭제하면 공유 오류가 발생될꺼 같아서 저장할때만 켰다가 저장이 완료 되면 닫아놓게 했습니다.
:
: 또한, SaveString()함수를 주석처리 해도 마찬가지로 메모리가 계속 올라가는 현상은 없어지지 않습니다. ㅜㅜ
:
: 그리고, PostMessage를 사용하면 윈도우의 스택에 계속 쌓여있다가 순차적으로 처리되는 것으로 알고 있습니다.
:
: (파일 처리등의 부하를 윈도우에 떠넘기려는 수작(?)입니다. *^-^*) 만약 제가 알고 있는것이 맞다면 순차적인
:
: 처리 방식이기 때문에 메모리 오류는 발생되지 않을꺼라 생각됩니다. (밑에 있는 소스로 테스트를 해봤는데,
:
: 메모리 오류는 발생되지 않았습니다.)
:
: 첨부 파일에 소스를 올려봅니다.
:
: 여러 고수님들의 조언을 부탁드립니다.
:
:
:
: locke 님이 쓰신 글 :
: : 안녕하세요? locke입니다.
: :
: : 소스 잠깐 봤는데요. PostMessage로 로그 발생시키도록 하신건 괜찮은 아이디어 같습니다.
: :
: : 근데 메모리 해제이전에 SaveString() 함수를 호출해서 매번 파일을 열고 닫으시는데
: :
: : 이건 좀 부적합해 보입니다. 지금은 테스트라 그냥 루프 돌리셨겠지만.. 이 루프가 상당히 빠르거든요.
: :
: : 파일 열고 닫는 시간에 수도 없이 호출이 될거고.. 파일 핸들 하나같고 access 충돌도 발생할텐데
: :
: : 로그저장은 잘 되는지요? 로그에 순번 매겨서 한번 저장해보세요. 제가 볼땐 제대로 저장이 안될듯 싶습니다.
: :
: : 받는 쪽에서 무작위로 발생하는 메시지 수신값에 대한 저장방식을 달리하셔야 될듯 싶구요.
: :
: : 파일 액세스 쪽에서 오류가 나서 동적메모리 할당 부분을 실행하지못하고 루틴을 빠져나가는게 아닌가 싶네요.
: :
: : 그냥 제 의견입니다. 참고하시고 다른 전문가 분이 도움주시리라 생각합니다.
: :
: : -locke
: :
: :
: : 이길남.HoPe 님이 쓰신 글 :
: : : 안녕하세요. 아래와 같이 이벤트 로그 클래스를 구성하였습니다.
: : :
: : :
: : : CSimpleTrace *SimpleTrace[5] = { NULL, NULL, NULL, NULL, NULL };
: : : //---------------------------------------------------------------------------
: : : //      CSimpleTrace
: : : //                                                          Date : 09.11.05
: : : //                                                          Dev. : HoPe
: : : //---------------------------------------------------------------------------
: : : __fastcall CSimpleTrace::CSimpleTrace(String AFileName)
: : : {
: : :     FFileName = AFileName;
: : :     FDirectory = ExtractFilePath(ParamStr(0)) + "TRACE LOG\\";
: : :     if(!DirectoryExists(FDirectory))    ForceDirectories(FDirectory);
: : : 
: : :     DeleteOldFiles(31);
: : :     FWindowHandle = AllocateHWnd(WndProc);
: : : }
: : : //---------------------------------------------------------------------------
: : : __fastcall CSimpleTrace::~CSimpleTrace(void)
: : : {
: : :     DeallocateHWnd(FWindowHandle);
: : : }
: : : //---------------------------------------------------------------------------
: : : 
: : : void __fastcall CSimpleTrace::DeleteOldFiles(int ABeforeDay)
: : : {
: : :     TSearchRec mSr;
: : :     if(FindFirst(FDirectory + "*.*", faAnyFile, mSr) == 0)
: : :     {
: : :         do
: : :         {
: : :             if(mSr.Name == ".")                                     continue;
: : :             if(mSr.Name == "..")                                    continue;
: : :             if(mSr.Attr == faDirectory)                             continue;
: : : 
: : :             if(Now() - ABeforeDay <= FileDateToDateTime(mSr.Time))  continue;
: : :             DeleteFile(AnsiString(FDirectory + mSr.Name).c_str());
: : :         }
: : :         while(!FindNext(mSr));
: : :     }
: : : }
: : : //---------------------------------------------------------------------------
: : : 
: : : void __fastcall CSimpleTrace::WndProc(TMessage &Msg)
: : : {
: : :     if(Msg.Msg == WM_USER + 1)
: : :     {
: : :         SaveString((char *)Msg.WParam, Msg.LParam);
: : : 
: : :         delete [] ((char *)Msg.WParam);
: : : 
: : : //        free((char *)Msg.WParam);
: : :     }
: : : }
: : : //---------------------------------------------------------------------------
: : : void __fastcall CSimpleTrace::SaveString(char *AString, int ALength)
: : : {
: : :     FILE *mFile = fopen(AnsiString(FDirectory + FFileName + ".INI").c_str(), "a+");
: : :     if(mFile)
: : :     {
: : :         try
: : :         {
: : :             fwrite(AString, sizeof(char), ALength, mFile);
: : :         }
: : :         __finally
: : :         {
: : :             fclose(mFile);
: : :         }
: : :     }
: : : }
: : : //---------------------------------------------------------------------------
: : : void __fastcall CSimpleTrace::AddTrace(String AMessage)
: : : {
: : :     int mLenght = AMessage.Length();
: : :     char *mChar = new char[mLenght + 1];
: : : //    char *mChar = (char *)malloc(mLenght + 1);
: : : 
: : :     mChar[mLenght] = '\n';
: : :     memcpy(mChar, AMessage.c_str(), sizeof(char) * mLenght);
: : :     PostMessage(FWindowHandle, WM_USER + 1, (unsigned int)mChar, mLenght + 1);
: : : //    free((char *)mChar);
: : : }
: : : //---------------------------------------------------------------------------
: : : 

: : :
: : : 하지만 아래 버튼 1번을 클릭하고 난 후, 메모리가 계속 증가만(첨부 파일 참조) 되고 줄어들지가 않습니다.
: : : 이유를 찾을 수가 없습니다.
: : :
: : : 고수님들의 조언을 부탁드립니다. 수고하십시요.
: : :
: : :
: : : __fastcall TForm1::TForm1(TComponent* Owner)
: : :     : TForm(Owner)
: : : {
: : :     SimpleTrace[0] = new CSimpleTrace("INPUT");
: : : }
: : : //---------------------------------------------------------------------------
: : : 
: : : void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
: : : {
: : :     delete SimpleTrace[0];
: : : }
: : : //---------------------------------------------------------------------------
: : : void __fastcall TForm1::Button1Click(TObject *Sender)
: : : {
: : :     for(int i = 0; i < 1000000; i++)
: : :     {
: : :         SimpleTrace[0]->AddTrace(Edit1->Text);
: : :     }
: : : }
: : : //---------------------------------------------------------------------------
: : : 

+ -

관련 글 리스트
60871 동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이길남.HoPe 1414 2010/04/23
60885     Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이현수 1486 2010/04/24
60888         Re:Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이길남.HoPe 1355 2010/04/25
60892             Re:Re:Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이길남.HoPe 1469 2010/04/26
60884     Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이경문 1221 2010/04/24
60887         Re:Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이길남.HoPe 1177 2010/04/25
60872     Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. locke 1276 2010/04/23
60882         Re:Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이길남.HoPe 1415 2010/04/24
60883             Re:Re:Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 장성호 1393 2010/04/24
60886                 Re:Re:Re:Re:동적 생성한 메모리를 WndProc에서 Delete를 하는데 소멸이 안됩니다. 이길남.HoPe 1391 2010/04/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.