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
[8742] 계속해서 메모리 할당하면 메모리 충돌로 shotdown 가능성이 높아집니까 ?
mach9 [] 1344 읽음    2001-07-04 15:23
<<서문>>
저는 PLC에서 RS-232로 데이타를 읽어와서
1초에 한번꼴로 파라독스DB에 레코드를 생성하는
프로그램을 만들고 있습니다. 소위 이야기하는 MMI(Man-Machine-Interface)프로그램의
데이타 로깅(Logging)부분입니다.
통신모듈에 CPU TIme을 빼앗기면 안되기 때문에
통신관련Thread(이하 "■")  와 데이타로깅Thread(이하 "▲") 둘을 이용하고 있습니다. 
앞에서 언급한 ■에  CPU TIme을 빼앗기면 안되기 때문에 Priority를 3~4로주고
▲에 0을 주었습니다.

<<본론>>
문제는 ▲에서 발생합니다.
- ■에서 TQueue로 TSmallIntArray로 정의된 배열 데이타가 계속 할당생성(New)되어서 Push됩니다.
- ▲에서 TQueue로부터 TSmallIntArray는 Pop되어  ParaDox DB  에Append 된뒤 delete됩니다.
문제점 ===> ▲에서 일정시간이 지나면(1시간 또는 2시간 특히 정한 시간이 없음)
            PC가 SHotDown 됩니다. 
- DB에 이상이 있을 수도 있을까봐 Personel Oracle를 쓰봐도 마찬가집니다.
- 제생각에 TSmallIntArray를 계속 New 하고 Delete하는 과정에서 Error가 나는 것이 아닐런지 ?????
  원형Queue를 사용하면 메모리 할당을 계속 하지 않으면 괜챤을지..(아직 해보지 않아서)
  어떻게 해야할지 모르겠습니다.
- DB상에 문제라면 TExt 파일로 저장해서 하루에 한번씩 batch로 DB에 넣어야 할까요...
  이러면 문제가 많습니다.
- 해결해주시면 제가 한잔 사겠습니다. 창원에 내려 오시면...내려 오기전에 메일 주세요 꼭...

■------------------------------
....
통신 모듈
......

QueueAnalog->Push(AnalogSmallIntArray);
AnalogSmallIntArray = new TSmallIntArray(0,0);
if(QueueAnalog->Count() > 10){
   if(!m_ExistThreadAnalogLogging){
      ThreadAnalogLogging = new TThreadAnalogLogging(true); //Thread 만들어지지 않았다면 생성
      m_ExistThreadAnalogLogging = true;
      ThreadAnalogLogging->FreeOnTerminate =true; // Set FreeOnTerminate to true if you want to explicitly destroy threads after they finish executing.
      ThreadAnalogLogging->Priority = StrToInt(ComboBoxThreadAnalog->Text);
   }
   if(ThreadAnalogLogging->Suspended){
      ThreadAnalogLogging->Resume();
      LabelMessage2->Caption = "ThreadAnalogLog Resume !" ;
   }
}


▲----------------------------------
void __fastcall TThreadAnalogLogging::Execute()
{
   int i=0;
   AnsiString strTemp0="";
   TSmallIntArray *AnalogSmallIntArray;
   //---Thread 무한 루프----------------------------------------------------------------------------
   TableAnalogLog->Open();
while(!Terminated)
{
      if(QueueAnalog->Count() == 0)
      {
         LabelMessage2->Caption = "ThreadAnalogLog is Terminated!" ;
         ThreadAnalogLogging->Terminate();//Thread0->Terminated = true로 됨
         m_ExistThreadAnalogLogging = false;
         continue;
      }

      if(QueueAnalog->Count() > 0)
      {
            AnalogSmallIntArray = (TSmallIntArray*)QueueAnalog->Pop();
        //--- Disk Logging ------------------------------------------------------------------------
         //향후에 PLC System 시간을 전송받아서 사용해야함.
         TableAnalogLog->Append();
         TableAnalogLog->FieldValues["AnalogDate"] = FormatDateTime("yyyy-mm-dd", Now());
         strTemp0.printf("%02d:%02d:%02d:%03d",(int)AnalogSmallIntArray->GetItem(0),
                                       (int)AnalogSmallIntArray->GetItem(1),
                                       (int)AnalogSmallIntArray->GetItem(2),
                                       (int)AnalogSmallIntArray->GetItem(3));
         TableAnalogLog->FieldValues["AnalogTime"] =  strTemp0;
         TableAnalogLog->FieldValues["Analog0"] = (int)AnalogSmallIntArray->GetItem(0);
         TableAnalogLog->FieldValues["Analog1"] = (int)AnalogSmallIntArray->GetItem(1);
         TableAnalogLog->FieldValues["Analog2"] = (int)AnalogSmallIntArray->GetItem(2);
         TableAnalogLog->FieldValues["Analog3"] = (int)AnalogSmallIntArray->GetItem(3);
         TableAnalogLog->FieldValues["Analog4"] = (int)AnalogSmallIntArray->GetItem(4);
         TableAnalogLog->FieldValues["Analog5"] = (int)AnalogSmallIntArray->GetItem(5);
         TableAnalogLog->FieldValues["Analog6"] = (int)AnalogSmallIntArray->GetItem(6);
         TableAnalogLog->FieldValues["Analog7"] = (int)AnalogSmallIntArray->GetItem(7);
         TableAnalogLog->FieldValues["Analog8"] = (int)AnalogSmallIntArray->GetItem(8);
         TableAnalogLog->FieldValues["Analog9"] = (int)AnalogSmallIntArray->GetItem(9);
         try{ TableAnalogLog->Post(); }
         catch(Exception &E)
         {
            LabelErrorMessage->Caption = "TableAnalogLog-->" + E.Message;
            TableAnalogLog->Cancel();
         }
            delete AnalogSmallIntArray;
      } //if(QueueAnalog->Count() > 0)
   } //while((!Terminated)
   TableAnalogLog->Close();
}


+ -

관련 글 리스트
8742 계속해서 메모리 할당하면 메모리 충돌로 shotdown 가능성이 높아집니까 ? mach9 1344 2001/07/04
8760     Re:계속해서 메모리 할당하면 메모리 충돌로 shotdown 가능성이 높아집니까 ? 주경민 1885 2001/07/05
8761         [새로운 질문]세마포어나 크리티컬 섹션 을 C++ Builder에서 어떻게 구현해야 합니까? mach9 1798 2001/07/05
8762             Re:[새로운 질문]세마포어나 크리티컬 섹션 을 C++ Builder에서 어떻게 구현해야 합니까? 주경민 3631 2001/07/05
8772                 Re:Re:[감사의표시]세마포어나 크리티컬 섹션 을 C++ Builder에서 어떻게 구현해야 합니까? mach9 1408 2001/07/05
8745     Re:계속해서 메모리 할당하면 메모리 충돌로 shotdown 가능성이 높아집니까 ? makerjh 1553 2001/07/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.