초당 데이터를 하나씩 저장하게 되고 최고 120,9600개의 데이터를 저장합니다.
따라서, 매초당 한 번씩 데이터를 저장하는 작업을 수행하고, DBGrid 상에는 마지막 저장시간부터 1시간 전의 3600개 데이터를 표시하려고 합니다.
시뮬레이션을 위해 임의로 데이터를 저장하는 프로시저를 작성 하였습니다.
procedure TfrmMain.DataSave;
var
st, et: Longword;
cur: TDateTime;
begin
st := GetTickCount;
Randomize;
cur := Now;
while (bRun) do
begin
Application.ProcessMessages;
et := GetTickCount;
if ((et-st) > 990) then
begin
grdData.DataSource.DataSet.Active := False;
adoQuery.SQL.Add( 'INSERT INTO Dose VALUES(' +
Format('%u', [dwCounts+1]) + ', ''' +
DateTimeToStr(IncSecond(cur, dwCounts)) + ''', ' +
Format('%.1f', [(100 + Random(10)) / 10]) + ', ' +
Format('%.1f', [(100 + Random(10)) / 10]) + ', ' +
Format('%.1f', [(100 + Random(10)) / 10]) + ', ' +
Format('%.1f', [(100 + Random(10)) / 10]) + ', ' +
Format('%.1f', [(100 + Random(10)) / 10]) + ', ' +
Format('%.1f', [(100 + Random(10)) / 10]) + ', ' +
'''Norm/Norm'', ''' +
'No/' + Format('%.1f', [23 + (Random(5) / 10)]) + '/' + Format('%.1f', [2 + (Random(10) / 10)]) + '/NW' +
''');'
);
adoQuery.ExecSQL;
adoQuery.SQL.Clear;
adoQuery.SQL.Add('SELECT * FROM Dose WHERE Ion BETWEEN 10.0 AND 10.3');
adoQuery.Open;
adoQuery.SQL.Clear;
grdData.DataSource.DataSet.Active := True;
grdData.DataSource.DataSet.Last;
Inc(dwCounts);
memProcTime.Lines.Add(Format('%d - %d', [dwCounts, (et-st)]));
st := et;
end;
end;
end;
코드처럼 (et-st)가 990이 넘는 순간 하나의 데이터를 저장합니다. (990으로 설정한 이유는 제 PC의 처리 속도상...)
여기에서 grdData.DataSource.DataSet.Active 속성을 False/True로 설정하는데 이 과정에서 아래쪽의 True에 의해 저장되어 있는 전체데이터를 refresh하는 것 같습니다. 이로 인해 DBGrid가 깜빡거리는 것이고, 데이터가 많아 질수록 느려지게 되는거 같습니다.
하지만, 이 속성을 처리해주지 않으면 작업 과정이 DBGrid상에 전혀 표시되지 않는데에 또 다른 문제가 있습니다. 데이터가 전혀 표시가 되지 않습니다.
위의 제 코드에서 매초당 한 번씩 데이터를 저장하는 작업을 수행하고, DBGrid 상에는 마지막 저장시간부터 1시간 전의 3600개 데이터를 표시하려고 할 때에 어떻게 수정해야 할지 알고 싶습니다.
DB는 MS Access 2003, DB 연결관리는 ODBC 설정 완료 후, Design상에서 TADOConnection, TDataSource, TADOQuery, TADOTable, TDBGrid를 사용하고 있습니다.