안녕하세요? 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);
: }
: }
: //---------------------------------------------------------------------------
: