读书人

代码优化有关问题

发布时间: 2012-04-01 17:23:46 作者: rapoo

代码优化问题
谁能帮我把这段代码优化一下,以提高效率?
var
i,j:integer;
begin
ADODataSetFenbu.DisableControls;
for j:=1 to 30 do
begin
ADODataSetFenbu.first;
i:=0;
while not ADODataSetFenbu.Eof do
begin
if ADODataSetFenbu.FieldByName('No'+inttostr(j)).asstring = '' then
begin
i:=i+1;
ADODataSetFenbu.edit;
ADODataSetFenbu.FieldByName('No'+inttostr(j)).asstring:=inttostr(i);
ADODataSetFenbu.post;
end
else
begin
i:=0;
end;
ADODataSetFenbu.next;
end;
end;
ADODataSetFenbu.EnableControls;
end;

[解决办法]

我自己测试了一下,同样一个25555条的表,我更新其中一个字段
放到主线程中用了将近一分钟,分十个线程执行的话在12~15秒之间
效果显而易见

Delphi(Pascal) code
PAS:unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, DB, ADODB,ActiveX,SyncObjs;const  WM_USERCOMPLETE=WM_USER+100;type  TDataUpdateThread=class(TThread)  private    FConnection:TADOConnection;    FQuery:TADOQuery;  protected    procedure Execute;override;  public    constructor Create(ASuspended:Boolean);    destructor Destroy;override;  end;  TForm1 = class(TForm)    Button1: TButton;    Button2: TButton;    Label1: TLabel;    Label2: TLabel;    ADOConnection1: TADOConnection;    ADOQuery1: TADOQuery;    Button3: TButton;    procedure Button1Click(Sender: TObject);    procedure Button2Click(Sender: TObject);    procedure FormCreate(Sender: TObject);    procedure FormDestroy(Sender: TObject);    procedure Button3Click(Sender: TObject);  private    Complete:Boolean;    ThreadList:TList;    StartTime:TDateTime;    Lock:TRTLCriticalSection;    procedure WMUSERCOMPLETE(var message:TMessage);message WM_USERCOMPLETE;    { Private declarations }  public    { Public declarations }  end;var  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin  StartTime:=Now;  ADOQuery1.First;  while Not ADOQuery1.Eof do  begin    ADOQuery1.Edit;    ADOQuery1.FieldByName('IsSpam').AsBoolean:=False;    ADOQuery1.Post;    ADOQuery1.Next;  end;  Label1.Caption:='单线程:开始时间:'+DateTimeToStr(StartTime)+'结束时间:'+DateTimeToStr(Now);end;procedure TForm1.Button2Click(Sender: TObject);var  Thread:TDataUpdateThread;  I: Integer;begin  StartTime:=Now;  ADOQuery1.First;  //启动线程  for I := 0 to 10 - 1 do  begin    Thread:=TDataUpdateThread(ThreadList.Items[I]);    Thread.Resume;  end;end;procedure TForm1.Button3Click(Sender: TObject);begin  ADOQuery1.Close;  ADOQuery1.SQL.Text:='Select * from tmMailList1';  ADOQuery1.Open;end;procedure TForm1.FormCreate(Sender: TObject);var  Thread:TDataUpdateThread;  I: Integer;begin  InitializeCriticalSection(Lock);  Complete:=False;  ADOQuery1.Close;  ADOQuery1.SQL.Text:='Select * from tmMailList1';  ADOQuery1.Open;  //创建线程  ThreadList:=TList.Create;  for I := 0 to 10 - 1 do  begin    Thread:=TDataUpdateThread.Create(True);    ThreadList.Add(Thread)  end;end;procedure TForm1.FormDestroy(Sender: TObject);begin  DeleteCriticalSection(Lock);end;procedure TForm1.WMUSERCOMPLETE(var message: TMessage);begin  ADOQuery1.Close;  ADOQuery1.Open;  Label2.Caption:='多线程:开始时间:'+DateTimeToStr(StartTime)+'结束时间:'+DateTimeToStr(Now);end;{ TDataUpdateThread }constructor TDataUpdateThread.Create(ASuspended: Boolean);begin  Inherited Create(ASuspended);  FConnection:=TADOConnection.Create(nil);  FConnection.ConnectionString:='False';  FConnection.Connected:=True;  FQuery:=TADOQuery.Create(nil);  FQuery.Connection:=FConnection;end;destructor TDataUpdateThread.Destroy;begin  FConnection.Free;  FQuery.Free;  inherited;end;procedure TDataUpdateThread.Execute;var  FID:Integer;  First:Boolean;begin  inherited;  First:=False;  while Not Terminated do  begin    while Not Form1.ADOQuery1.Eof do    begin      EnterCriticalSection(Form1.Lock);      if Not Form1.ADOQuery1.Eof then      begin        FID:=Form1.ADOQuery1.FieldByName('MID').AsInteger;        Form1.ADOQuery1.Next;      end      else      begin        if Not Form1.Complete then        begin          First:=True;          Form1.Complete:=True;        end;      end;      LeaveCriticalSection(Form1.Lock);      if Not Form1.Complete then      begin        FQuery.Close;        FQuery.SQL.Text:='Update tmMailList1 set IsSpam=0 where MID='+IntToStr(FID);        FQuery.ExecSQL;      end;      if First then      begin        PostMessage(Form1.Handle,WM_USERCOMPLETE,0,0);      end;      if Form1.Complete then      begin        Terminate;      end;    end;  end;end;initialization    CoInitialize(nil);finalization    CoUnInitialize;end.DFM:object Form1: TForm1  Left = 0  Top = 0  Caption = 'Form1'  ClientHeight = 263  ClientWidth = 483  Color = clBtnFace  Font.Charset = DEFAULT_CHARSET  Font.Color = clWindowText  Font.Height = -11  Font.Name = 'Tahoma'  Font.Style = []  OldCreateOrder = False  OnCreate = FormCreate  OnDestroy = FormDestroy  PixelsPerInch = 96  TextHeight = 13  object Label1: TLabel    Left = 24    Top = 143    Width = 385    Height = 13    AutoSize = False    Caption = 'Label1'  end  object Label2: TLabel    Left = 24    Top = 184    Width = 385    Height = 13    AutoSize = False    Caption = 'Label1'  end  object Button1: TButton    Left = 72    Top = 112    Width = 75    Height = 25    Caption = #21333#32447#31243#22788#29702    TabOrder = 0    OnClick = Button1Click  end  object Button2: TButton    Left = 288    Top = 112    Width = 75    Height = 25    Caption = #22810#32447#31243#22788#29702    TabOrder = 1    OnClick = Button2Click  end  object Button3: TButton    Left = 200    Top = 32    Width = 75    Height = 25    Caption = 'Button3'    TabOrder = 2    OnClick = Button3Click  end  object ADOConnection1: TADOConnection    Connected = False    LoginPrompt = False    Provider = 'SQLOLEDB.1'    Left = 96    Top = 24  end  object ADOQuery1: TADOQuery    Connection = ADOConnection1    Parameters = <>    Left = 96    Top = 64  endend 

读书人网 >.NET

热点推荐