Q&A

  • 고수님들 code좀 봐주세요.. 메모리 증가 문제..
다음 코드는 VirtualStringTree를 이용해서 Tree형식의 Table을 구성하는 코드인데요.
그 List를 출력하는 코드입니다.
이 프로시저를 자주 호출하게 되는데요 이부분을 호출하게 되면 프로그램의 메모리 사용률이 점점 증가합니다.
하루정도 띄워놓으면 급기하 윈도우가 버벅거리는 현상까지 나옵니다.

제가 코드를 살펴보았으나.. MySQL query하는 문제는 아닙니다.. 왜냐면 query한다음 free를 다 해줬거든요..

문제는 Data : PCustRec;  로 선언된 놈인데..
PcustRec은 Record형태의 데이터 형식입니다..

PCustRec = ^TCustRec;
TCustRec = packed record
   index : Integer;
   sessionId : Integer;
           .
           .
end;

이렇게 되어 있지요..

VirtualStringTree의 Demo소스를 참고로 만들었는데.. 영 감이 잡히질 않습니다.
암튼 저놈때문에 메모리가 증가하는듯 한데.. 해결방법을 잘 모르겠습니다..

초보의 한계이지요 ㅠㅠ

아래는 메모리가 증가하는 프로시저 부분입니다..
고수님들의 답변부탁드리구요~~

새해복 많이 받으세요~~ ^^:



==================================================================================        

procedure TF_SessionManager.getSessionExpandList();
const
LevelToCheckType: array[0..3] of TCheckType = (ctTriStateCheckBox, ctTriStateCheckBox, ctCheckBox, ctNone);
var
q_node : TZMySQLQuery;
q_sess : TZMySQLQuery;
zMySQ : TZMySqlQuery;

Node : PVirtualNode;
LastRootNode : PVirtualNode;

Data : PCustRec;
sessionReg : Integer;
indexCnt : Integer;       // schdule gauge를 (Cell 위치계산) 위한 index count
begin
sessionReg := 0;
indexCnt := 0;
zMySQ := DM.fetch('select sess.*, node.*, '+
                   ' list.node_type, list.node_ntarget, list.node_status,'+
                   ' list.node_level, list.parent_id, list.node_response, list.node_check, list.node_expand'+
                   ' from vbms_session sess, vbms_node node, vbms_node_list list'+
                   ' where (sess.session_id = list.session_id) and (node.node_id = list.node_id)'+
                   ' order by sess.session_id, list.node_level, node.node_name asc');
with VST_Session, zMySQ do
begin
   BeginUpdate;
   Clear;
   NodeDataSize := SizeOf(TCustRec);

   while not(Eof) do
   begin
     // Session
     if (sessionReg <> FieldByName('session_id').AsInteger) then // 새로운 session이 검색
3  COMMENTS
  • Profile
    손희석 2003.12.27 08:58
    포인터 사용시는 항상 메모리 해제에 신경써 주셔야 되는데

    코딩하신것에 보면 메모리 해제를 해주신것 같지 않아 보입니다.

    ex) pt := nil; (pt는 포인터 변수)

    마지막 Data쓰신다음 Data := nil로 함 해보세요 ^^

    될련지 잘 모르겠지만 그럿듯해서 끄적여봤습니다.. 저도 초보라서 ^^

    더 고수님의 명확한 답변이 있었으면 하네요

  • Profile
    진돌 2003.12.27 19:01
    답변 감사드립니다.. ^^

    Data := nil;  넣었는데도 메모리 증가는 여전하구요..
    freemem(Data); 도 해보구.. 여러가지 해봤는데 해결이 안되는군요..

    고수님들의 도움이 필요합니다..  ㅠㅠ




  • Profile
    손희석 2003.12.28 03:27
    님 그러면 그부분 프로시져 주석처리하고 메모리 증가가 일어나나 한번 체크해보세요..

    그렇지 않다면 다른부분이 문제인듯한데.. 하여튼 여기 저기 주석처리해보고 테스트하면 나오지않을까 싶네요 ^^