즐거운 월요일 아침입니다.
이현수님께서 말씀하신 메세지 큐 오버플로우 현상이지 테스트를 Button1Click을 아래와 같이 바꿨습니다.
for(int i = 0; i < 1000; i++)
{
for(int k = 0; k < 1000; k++)
{
SimpleTrace[0]->AddTrace(Edit1->Text);
}
Application->ProcessMessages();
}
결론은, 메모리가 증가되지 않았습니다.
추정되는 원인은 이현수님께서 말씀하신데로 메세지 큐 오버플로우 현상인거 같습니다.
관심을 가져준 여러분께 감사드립니다.
그럼 금주도 즐플 하십시요~
이길남.HoPe 님이 쓰신 글 :
: 이현수님 답변 감사합니다.
:
: for문을 백만번 돌린 이유는 메모리 증, 감이 확연히 보이라고 그렇게 한것이었습니다.
:
: 그러면,
:
: for문 안에 Application->Processmessage를 넣어서 테스트해보면 메세지 큐 오버플로우 현상인지 확인이 될것 같습니다.
:
: 지금 PC는 VC만 깔려 있어서리 확인을 할 수가 없네요...ㅜㅜ
:
: 월욜날 출근하면 바로 확인해 보겠습니다.
:
: 친절한 답변 감사드립니다. *^0^*
:
: 이현수 님이 쓰신 글 :
: : SimpleTrace[0]이 TForm1과 동일한 스레드에 있네요.
: : 따라서, Button1Click 메서드 안의 for 루프를 모두 돈 다음에
: : 메시지 펌프 루프로 돌아가서 GetMessage를 호출해서,
: : Button1Click 메서드 안에서 호출한 SimpleTrace의 AddTrace 메서드 안에서 PostMessage로 보낸,
: : 메시지들을 받게 되어있는데 Button1Click 메서드 안의 for 루프를 도는 횟수가 무려 백만 번이나 되어서
: : 메시지 큐가 오버플로우되면서 이후 메시지들은 메시지큐에 들어가지 않을 것으로 보입니다.
: : 그렇게 되면 SimpleTrace의 AddTrace 메서드에서 할당한 메모리는 해제될 기회가 없겠지요.
: :
: : SimpleTrace[0]이 TForm1과 다른 스레드에 있을 때도 SimpleTrace 스레드의 처리속도에 따라
: : 이러한 문제가 발생될 소지가 있을 것이구요.
: :
: :
: : 이길남.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);
: : : }
: : : }
: : : //---------------------------------------------------------------------------
: : :