Mysql 有没有比这更好的方法来阻止DBgrid随着耗时的更新而闪烁?

Mysql 有没有比这更好的方法来阻止DBgrid随着耗时的更新而闪烁?,mysql,delphi,tdbgrid,Mysql,Delphi,Tdbgrid,在下面的情况下,有人能就如何实现我的目标提供建议吗? (我不知道Thead是否有用,但以前从未使用过。) 在我的Delphi应用程序中,我有一个通过Internet对外部MYSQL数据库运行的查询。查询结果显示在DBGrid中(最多50行) 用户单击按钮进行“web检查”,然后发生以下情况 首先,我将dataset的一个字段(web_响应)设置为空字符串,以清除DBGrid中显示的任何现有数据 然后,对于数据集中的每一行,我提取一个字段(FieldA)的值,将其传递给一个函数,并将另一个字段(

在下面的情况下,有人能就如何实现我的目标提供建议吗? (我不知道Thead是否有用,但以前从未使用过。)

在我的Delphi应用程序中,我有一个通过Internet对外部MYSQL数据库运行的查询。查询结果显示在DBGrid中(最多50行)

用户单击按钮进行“web检查”,然后发生以下情况

  • 首先,我将dataset的一个字段(web_响应)设置为空字符串,以清除DBGrid中显示的任何现有数据

  • 然后,对于数据集中的每一行,我提取一个字段(FieldA)的值,将其传递给一个函数,并将另一个字段(web_响应)的值设置为该函数的结果

  • 函数本身使用IdHTTP,使用传递的参数在不同的远程网站上执行搜索,并返回响应字符串。这个过程大约需要1到2秒

我想要的效果是网格“即时”清除所有web响应字段,然后逐行将web响应字段设置为一个值,每个值都显示为设置的值

下面的代码工作正常,但没有完全达到我需要的效果。我想知道在什么地方使用线程,而不是application.processmessages,是否可以改善情况

我现在得到的效果是网格在一两秒钟内完全变为空白,然后重新出现web响应列为空白。 然后,这些行会以大约每1s一行的速度通过web响应进行更新,但每次添加新响应时网格都会剧烈闪烁。 如果线程不起作用,有没有更好的方法来完成我正在做的事情

我目前使用的代码(更改标识符以保护无辜者)

//清空任何预先存在的web响应
//在清除现有web响应时,禁用控件以停止DBgrid闪烁
DBGrid1.DataSource.DataSet.DisableControls;
我的问题1.首先;
而不是MyQuery1.Eof do
开始
MyQuery1.编辑;
MyQuery1.FieldByName('web_响应')。关联字符串:='';
MyQuery1.下一步;
结束;
DBGrid1.1更新数据//再次显示清除的网格
DBGrid1.DataSource.DataSet.EnableControls;
//对于每一行,检查web上的FieldA并显示响应
我的问题1.首先;
而不是MyQuery1.Eof do
开始
DataToCheck:=MyQuery1.FieldByName('FieldA').AssString//获取要检查的数据
//获取web响应并将其放入数据集
MyQuery1.编辑;
MyQuery1.FieldByName('web_响应').AssString:=GetWebCheckResponse(DataToCheck);

Application.ProcessMessages;/,'因为循环很慢自从我上次接触Delphi以来已经7年多了,我们不允许使用数据感知组件,所以我可能在这里给你错误的建议。但是,您似乎过于频繁地刷新网格。尤其是在循环中刷新网格

我建议将代码更改为:

DBGrid1.DataSource.DataSet.DisableControls;
MyQuery1.First;
while not MyQuery1.Eof do
begin
  MyQuery1.Edit;
  MyQuery1.FieldByName('web_response').AsString := '';
  MyQuery1.Next;
end;



//For each row, check FieldA on the web and show response
MyQuery1.First;
while not MyQuery1.Eof do
begin
   DataToCheck := MyQuery1.FieldByName('FieldA').AsString ; //get data to check
   //get the web response and put into dataset
   MyQuery1.Edit;
   MyQuery1.FieldByName('web_response').AsString := GetWebCheckResponse(DataToCheck);
   Application.ProcessMessages; //,'cos the loop is slow <<-- can I get rid of this and use    threads?

   MyQuery1.Next;
end;
DBGrid1.DataSource.DataSet.EnableControls; 
DBGrid1.RefreshData; //show the response we just put in dataset
DBGrid1.DataSource.DataSet.DisableControls;
我的问题1.首先;
而不是MyQuery1.Eof do
开始
MyQuery1.编辑;
MyQuery1.FieldByName('web_响应')。关联字符串:='';
MyQuery1.下一步;
结束;
//对于每一行,检查web上的FieldA并显示响应
我的问题1.首先;
而不是MyQuery1.Eof do
开始
DataToCheck:=MyQuery1.FieldByName('FieldA').AssString//获取要检查的数据
//获取web响应并将其放入数据集
MyQuery1.编辑;
MyQuery1.FieldByName('web_响应').AssString:=GetWebCheckResponse(DataToCheck);

Application.ProcessMessages;/,'因为循环很慢自从我上次接触Delphi以来已经7年多了,我们不允许使用数据感知组件,所以我可能在这里给你错误的建议。但是,您似乎过于频繁地刷新网格。尤其是在循环中刷新网格

我建议将代码更改为:

DBGrid1.DataSource.DataSet.DisableControls;
MyQuery1.First;
while not MyQuery1.Eof do
begin
  MyQuery1.Edit;
  MyQuery1.FieldByName('web_response').AsString := '';
  MyQuery1.Next;
end;



//For each row, check FieldA on the web and show response
MyQuery1.First;
while not MyQuery1.Eof do
begin
   DataToCheck := MyQuery1.FieldByName('FieldA').AsString ; //get data to check
   //get the web response and put into dataset
   MyQuery1.Edit;
   MyQuery1.FieldByName('web_response').AsString := GetWebCheckResponse(DataToCheck);
   Application.ProcessMessages; //,'cos the loop is slow <<-- can I get rid of this and use    threads?

   MyQuery1.Next;
end;
DBGrid1.DataSource.DataSet.EnableControls; 
DBGrid1.RefreshData; //show the response we just put in dataset
DBGrid1.DataSource.DataSet.DisableControls;
我的问题1.首先;
而不是MyQuery1.Eof do
开始
MyQuery1.编辑;
MyQuery1.FieldByName('web_响应')。关联字符串:='';
MyQuery1.下一步;
结束;
//对于每一行,检查web上的FieldA并显示响应
我的问题1.首先;
而不是MyQuery1.Eof do
开始
DataToCheck:=MyQuery1.FieldByName('FieldA').AssString//获取要检查的数据
//获取web响应并将其放入数据集
MyQuery1.编辑;
MyQuery1.FieldByName('web_响应').AssString:=GetWebCheckResponse(DataToCheck);

Application.ProcessMessages;/,'因为循环很慢自从我上次接触Delphi以来已经7年多了,我们不允许使用数据感知组件,所以我可能在这里给你错误的建议。但是,您似乎过于频繁地刷新网格。尤其是在循环中刷新网格

我建议将代码更改为:

DBGrid1.DataSource.DataSet.DisableControls;
MyQuery1.First;
while not MyQuery1.Eof do
begin
  MyQuery1.Edit;
  MyQuery1.FieldByName('web_response').AsString := '';
  MyQuery1.Next;
end;



//For each row, check FieldA on the web and show response
MyQuery1.First;
while not MyQuery1.Eof do
begin
   DataToCheck := MyQuery1.FieldByName('FieldA').AsString ; //get data to check
   //get the web response and put into dataset
   MyQuery1.Edit;
   MyQuery1.FieldByName('web_response').AsString := GetWebCheckResponse(DataToCheck);
   Application.ProcessMessages; //,'cos the loop is slow <<-- can I get rid of this and use    threads?

   MyQuery1.Next;
end;
DBGrid1.DataSource.DataSet.EnableControls; 
DBGrid1.RefreshData; //show the response we just put in dataset
DBGrid1.DataSource.DataSet.DisableControls;
我的问题1.首先;
而不是MyQuery1.Eof do
开始
MyQuery1.编辑;
MyQuery1.FieldByName('web_响应')。关联字符串:='';
MyQuery1.下一步;
结束;
//对于每一行,检查web上的FieldA并显示响应
我的问题1.首先;
而不是MyQuery1.Eof do
开始
DataToCheck:=MyQuery1.FieldByName('FieldA').AssString//获取要检查的数据
//获取web响应并将其放入数据集
MyQuery1.编辑;
MyQuery1.FieldByName('web_响应').AssString:=GetWebCheckResponse(DataToCheck);

Application.ProcessMessages;/,'因为循环很慢自从我上次接触Delphi以来已经7年多了,我们不允许使用数据感知组件,所以我可能在这里给你错误的建议。但是,您似乎过于频繁地刷新网格。尤其是在循环中刷新网格

我建议将代码更改为:

DBGrid1.DataSource.DataSet.DisableControls;
MyQuery1.First;
while not MyQuery1.Eof do
begin
  MyQuery1.Edit;
  MyQuery1.FieldByName('web_response').AsString := '';
  MyQuery1.Next;
end;



//For each row, check FieldA on the web and show response
MyQuery1.First;
while not MyQuery1.Eof do
begin
   DataToCheck := MyQuery1.FieldByName('FieldA').AsString ; //get data to check
   //get the web response and put into dataset
   MyQuery1.Edit;
   MyQuery1.FieldByName('web_response').AsString := GetWebCheckResponse(DataToCheck);
   Application.ProcessMessages; //,'cos the loop is slow <<-- can I get rid of this and use    threads?

   MyQuery1.Next;
end;
DBGrid1.DataSource.DataSet.EnableControls; 
DBGrid1.RefreshData; //show the response we just put in dataset
DBGrid1.DataSource.DataSet.DisableControls;
我的问题1.首先;
而不是MyQuery1.Eof do
开始
MyQuery1.编辑;
MyQuery1.FieldByName('web_响应')。关联字符串:='';
MyQuery1.下一步;
结束;
//对于每一行,检查web上的FieldA并显示响应