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;