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