Delphi 循环后的ringGrid.EndUpdate。如果没有这一点,网格将在每次修改(添加新行、单元更新)后不断重新绘制

Delphi 循环后的ringGrid.EndUpdate。如果没有这一点,网格将在每次修改(添加新行、单元更新)后不断重新绘制,delphi,profiling,ado,tstringgrid,Delphi,Profiling,Ado,Tstringgrid,另一个技巧是在打开查询之前设置AdoQuery.LockType:=ltReadOnly。您也可以尝试检测分析器而不是采样分析器,以获得更好的结果(采样探查器遗漏了很多细节信息,大多数情况下,它们每秒的采样数不到1000个,而1000个已经很低了:只有快速了解情况才好) 检测分析器: AQTime(商业) AsmProfiler(开源) 找到答案的最佳方法是以某种方式分析您的代码。此外,不知道select*from time\u stamp应该返回多少行;也许是无数行?+1谢谢。有关于分析的

另一个技巧是在打开查询之前设置
AdoQuery.LockType:=ltReadOnly

您也可以尝试检测分析器而不是采样分析器,以获得更好的结果(采样探查器遗漏了很多细节信息,大多数情况下,它们每秒的采样数不到1000个,而1000个已经很低了:只有快速了解情况才好)

检测分析器:

  • AQTime(商业)
  • AsmProfiler(开源)

找到答案的最佳方法是以某种方式分析您的代码。此外,不知道
select*from time\u stamp
应该返回多少行;也许是无数行?+1谢谢。有关于分析的建议吗?在这种情况下,我每隔一秒进行大约一小时(加/减几秒)的测量你应该试试SamplingProfiler,可在上找到。它可以让你很好地了解你的程序在哪些方面花费了时间,它与Delphi应用程序配合得很好,而且是免费的。:)你的程序越慢,就越容易找到原因。试试看。@Mason:你链接到的探查器看起来做了所有正确的事情。它在墙上时钟时间对堆栈进行采样,并按代码行给出百分比,类似于RotateRight的缩放。我会随机暂停,但我认为这种剖析器绝对是下一个最好的选择。一定要回来让我们知道你的发现。+1一些非常好的反馈,谢谢。1) 哦!我把它移到循环前2)好品脱3)实际上我想访问“测量”的每个字段。在这种情况下,SELECT*是否可以接受?4) 这可能是个问题。它正在访问相同的ADO连接。我已经发布了上面的代码。您发布的DoSQLCommandWithResultSet版本不是您的程序调用的版本,签名是不同的(您程序中的一个有三个参数,您发布的一个与结果无关)。命名列总是比使用“*”更可取,因为您的代码会准确地告诉您可以引用哪些列,如果数据库不能提供您期望的任何列,则该命令将失败(这是您通常希望的)。哇,要恢复单个日期,这是一项非常艰巨的工作。将查询移到循环之外并放弃子例程(为什么要将多行传输到stringlist中?),只需使用ADO命令即可返回结果。+1+1表示歉意。我错误地在没有结果集的情况下发布。现在更正。是的,查询在循环之外。字符串列表+1的优点是,如果我知道它是一个float,我可以不使用TFloatField吗?如果没有,你能发几行,让我看看怎么做?谢谢#1和2绝对是好主意(你是说InputTempField是一个TField,我在循环中使用InputTempField.AsFloat?)。我已经在船上坐了三个人。对于#4,我有点像n00b,所以稍后再讨论。此外,它还需要是ODBC.TestRunDataStringGrid.RowCount:=ADODDataSet.RecordCount;事实证明,这是有区别的。有些人帮忙,但那个人真的做到了。有关更多差异,请参见更新的问题
ADODataSet。DisableControls
在迭代850.000条记录结果集时,给了我1000倍的速度(系好安全带)。我怎样才能多次投票?为什么那个该死的东西是默认启用的?
loop
  stringGrid.RowCount := stringGrid.RowCount + 1;
end loop
ADODataSet := TADODataSet.Create(Nil); ADODataSet.Connection := AdoConnection; ADODataSet.CommandText := 'SELECT * FROM measurements'; ADODataSet.CommandType := cmdText; ADODataSet.Open(); while not ADODataSet.eof do begin TestRunDataStringGrid.RowCount := TestRunDataStringGrid.RowCount + 1; measurementDateTime := UnixToDateTime(ADODataSet.FieldByname('time_stamp').AsInteger); DoSQlCommandWithResultSet('SELECT * FROM start_time_stamp', AdoConnection, resultSet); startDateTime := UnixToDateTime(StrToInt64(resultSet.Strings[0])); elapsedTime := measurementDateTime - startDateTime; TestRunDataStringGrid.Cells[0, Pred(TestRunDataStringGrid.RowCount)] := FormatDateTime('hh:mm:ss', elapsedTime); TestRunDataStringGrid.Cells[1, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('inputTemperature').AsFloat); TestRunDataStringGrid.Cells[2, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('outputTemperature').AsFloat); TestRunDataStringGrid.Cells[3, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('flowRate').AsFloat); TestRunDataStringGrid.Cells[4, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('waterPressure').AsFloat * convert); TestRunDataStringGrid.Cells[5, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('waterLevel').AsFloat); TestRunDataStringGrid.Cells[6, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('cod').AsFloat); ADODataSet.Next; end; ADODataSet.Close(); ADODataSet.Free(); Function DoSQlCommandWithResultSet(const command : String; AdoConnection : TADOConnection; resultSet : TStringList): Boolean; var i : Integer; AdoQuery : TADOQuery; begin Result := True; resultSet.Clear(); AdoQuery := TADOQuery.Create(nil); try AdoQuery.Connection := AdoConnection; AdoQuery.SQL.Add(command); AdoQuery.Open(); i := 0; while not AdoQuery.eof do begin resultSet.Add(ADOQuery.Fields[i].Value); i := i + 1; AdoQuery.Next; end; finally AdoQuery.Close(); AdoQuery.Free(); end; end;
procedure TForm1.Button1Click(Sender: TObject);
var
  InputTemp, OutputTemp: TField;
begin
  ADODataSet := TADODataSet.Create(Nil);
  try
    ADODataSet.Connection := ADOConnection;
    ADODataSet.CommandText := 'SELECT * FROM measurements';
    ADODataSet.Open;
    InputTemp := ADODataSet.FindField('inputTemperature');
    OutputTemp := ADODataSet.FindField('outputTemperature');
    // assign more fields here
    while not ADODataSet.Eof do begin
      // do something with the fields, for example:
      // GridCell := Format ('%3.2f', [InputTemp.AsFloat]);
      // GridCell := InputTemp.AsString;
      ADODataSet.Next;
    end;
  finally
    ADODataSet.Free;
  end;
end;