다음 코드는 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이 검색
코딩하신것에 보면 메모리 해제를 해주신것 같지 않아 보입니다.
ex) pt := nil; (pt는 포인터 변수)
마지막 Data쓰신다음 Data := nil로 함 해보세요 ^^
될련지 잘 모르겠지만 그럿듯해서 끄적여봤습니다.. 저도 초보라서 ^^
더 고수님의 명확한 답변이 있었으면 하네요