파이어버드 Ver 2.1 + 델파이 Xe를 사용하고 이며 서버에 데이터를 저정하고 클라이언트에서
실시간조회를 하는 구성입니다.(트래픽이 많지 않아 미들웨어는 사용하지 않음)
Timer를 써서 2분마다 서버에서 데이터를 읽어 그리드에 표시 하는데 프로그램을 종료하고 다시
실행 하였을때는 최신 값이 표시되지만 타이머에서 쿼리 문을 날렸을때는 프로그램 실행시 불러온
값만 표시가 되고 업데이트가 되지를 않는군요,,,
Timer문제인가 하여 쓰레드로 바꾸어 보아도 동일한 증상이 나옵니다.
더 이상한건 내부 시험에서는 더 낮은 사양의 클라이언 PC에 적용하여도 정상 동작하는데 업체에
설치된 곳에서는 이와 같은 증상이 나타 나는군요..
혹시 이와 같은 문제가 있으셨거나 어디가 문제인지 짐작 되시는 분 있으면 알려 주시면 감사하겠습니다.
쿼리는 진짜 간단합니다.
with RMSIWQueryRT do
begin
Close;
SQL.Clear;
SQL.Text := ' Select LDate, SENSORID,CHANNELID,CHANNELMODE,RVALUE,STATUS From TBDATALOG ' +
' Where (USERNAME=:a or USER1=:a or USER2=:a or USER3=:a or USER4=:a ) and ((LDate>=:b) and (LDate<=:c))' +
' order by CHANNELID, LDate desc';
ParamByName('a').DataType := ftString;
ParamByName('a').Size := 20;
ParamByName('a').Value := UName;
ParamByName('b').DataType := ftString;
ParamByName('b').Size := 19;
ParamByName('b').Value := formatDatetime('yyyy-mm-dd hh:nn:ss', IncDay(Now,-1));
ParamByName('c').DataType := ftString;
ParamByName('c').Size := 19;
ParamByName('c').Value := formatDatetime('yyyy-mm-dd hh:nn:ss', Now);
try
Open;
FetchAll;
first;
i := 1;
while Not Eof do
begin
if (FieldByName('CHANNELID').AsInteger = i) and (FieldByName('CHANNELID').AsInteger < 32) then
begin
Grd1.Cells[3,FieldByName('CHANNELID').AsInteger] := FieldByName('LDate').AsString;
Grd1.Cells[4,FieldByName('CHANNELID').AsInteger] := Format('%3.3f',[FieldByName('RVALUE').AsSingle]);
if FieldByName('STATUS').AsInteger = 1 then
begin
Grd1.Colors[0,FieldByName('CHANNELID').AsInteger] := ClNone;
end
else Grd1.Colors[0,FieldByName('CHANNELID').AsInteger] := clred;
inc(i);
Continue;
end
else if (FieldByName('CHANNELID').AsInteger = i) and (FieldByName('CHANNELID').AsInteger > 31) then
begin
Grd2.Cells[3,FieldByName('CHANNELID').AsInteger - 31] := FieldByName('LDate').AsString;
Grd2.Cells[4,FieldByName('CHANNELID').AsInteger - 31] := Format('%3.3f',[FieldByName('RVALUE').AsSingle]);
if FieldByName('STATUS').AsInteger = 1 then
begin
Grd2.Colors[0,FieldByName('CHANNELID').AsInteger - 31] := ClNone;
end
else Grd2.Colors[0,FieldByName('CHANNELID').AsInteger - 31] := clred;
inc(i);
Continue;
end;
Next;
if FieldByName('CHANNELID').AsInteger >= (i+1) then
i := FieldByName('CHANNELID').AsInteger;
end;
Except On EIBInterBaseError do
begin
Cancel;
end;
end;
end;
|