우선 친절한 답변 감사합니다.
기존에 메세지 큐에 쌓으면 반드시 순차적으로 처리 되는줄만 알았습니다. (무지함.....이란...)
혹시 왜 순차적으로 처리가 안되는지 좀더 자세한 설명 가능하신지요? (제가 잘 몰라서리... ㅜㅜ)
그리고, PostMessage는 제가 쓰레드를 돌리면서 로그 파일을 생성하려고 합니다.
물론, 쓰레드 안에서 로그 파일 생성은 가능하겠습니다만, 로그 파일은 단지 디버깅용입니다.
해서, 로그 파일 생성으로 인해 쓰레드 속도 저하를 막기 위해 PostMessage를 사용하는 것이 어떤가 하고 구상중이었습니다.
장성호님도 자동화 설비를 하셔서 아시겠지만, 자동화 설비의 Tack Time이라는 것도 무시하지 못하기 때문에
조금이라도 속도 저하 요소를 없애면서, 사용하려 하기 때문입니다.
그럼 즐거운 주말 보내십시요.
장성호 님이 쓰신 글 :
: 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);
: : : : }
: : : : }
: : : : //---------------------------------------------------------------------------
: : : :