SQL문으로 처리 할수 없는 함수가 있기 때문에 Stored Procedure를 사용하지 못하고
1초 단위 데이타(2048 Rows)를 받아서 아래와 같은 코드로 처리 하고 있습니다.
Function TInterfaceClass.GetAccData(STime, ETime : String; MIP: DWord; RDCnt, SKipCnt: Int64; FS: Word; Var PGBar:TJaheonGauge): Boolean;
var
L_RDCNT : integer;
L_SKipCnt : integer;
DataCnt : integer;
RPM : Word;
RPM0 : Word;
Label StartHere;
Label GoQuery;
Label ProcessEnd;
begin
Result := False;
TimeCnt := 0;
StartHere :
DataCnt := 0;
inc(TimeCnt);
L_SKipCnt := RDCnt * (TimeCnt - 1);
PGBar.Progress := TimeCnt;
with RMSIWQuery do
begin
Close;
SQL.Clear;
SQL.Add(' Select First ' + inttostr(FS) + ' SKIP ' + inttostr(L_SKipCnt) + ' LOGTIME, ListNum, RPM, RPM0, X_Acc, Y_Acc, Z_Acc from TBVIBDATA ');
SQL.Add(' Where (LOGTIME >= ' + STime + ') and (LOGTIME <= ' + ETime + ')');
Open;
FetchAll;
if RecordCount = 0 then
begin
PGBar.Progress := PGBar.MaxValue;
ReadDataCnt := TimeCnt - 1;
goto ProcessEnd;
end;
first;
while Not EOF do
begin
inc(DataCnt);
LOGTIME[TimeCnt-1] := FieldByName('LOGTIME').AsString;
RPM := FieldByName('RPM').AsInteger;
SECRPM[TimeCnt-1] := RPM;
RPM0 := FieldByName('RPM0').AsInteger;
ACCDATA_X[DataCnt-1] := FieldByName('X_Acc').AsFloat;
ACCDATA_Y[DataCnt-1] := FieldByName('Y_Acc').AsFloat;
ACCDATA_Z[DataCnt-1] := FieldByName('Z_Acc').AsFloat;
Next;
end;
CalGetData(TimeCnt-1,ACCDATA_X,ACCDATA_Y,ACCDATA_Z,FS,RPM0,RPM);
Application.ProcessMessages;
end;
goto GoQuery;
GoQuery:
goto StartHere;
ProcessEnd:
Result := True;
Exit;
end;
/////////////////////////////////////////////////////////////////////////
CalGetData, Display, Progress 등을 허지 않아도 120초(120번 재귀 호출)의 데이터를 처리하는데
20초 정도 시간이 소모 됩니다.
20분 데이터를 처리 할때는 너무 느려서 시간 계산이 불능.
개발 환경은 XP, 시스템 백업 사용 않함 설정, E6800, 메모리 2기가, Delphi 2007인데 잘못생각하고
있는 부분이나 코드가 잘못된 부분을 지적해 주시면 감사하겠습니다.
|