循环中有延时,导致在循化执行中不能关闭,如何可以关闭?

lostmoon 2010-02-09 07:02:33

循环中有延时,导致在循化执行中不能关闭,如何可以关闭?



程序循化取出数据库的URL,然后在webbrowser打开,每次打开间隔10s。




procedure Delay(dwMilliseconds: Longint);
var
iStart, iStop: DWORD;
begin
iStart := GetTickCount;
repeat
iStop := GetTickCount;
Application.ProcessMessages;
until (iStop - iStart) >= dwMilliseconds;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin

Form1.ADOQuery1.Close;
Form1.ADOQuery1.SQL.Clear;
Form1.ADOQuery1.SQL.Add('select * from keywords');
Form1.ADOQuery1.Active:=True;
Form1.ADOQuery1.ExecSQL;
ADOQuery1.first;

b:=true;
while(b) do
begin
while not adoquery1.eof do
begin
if not b then break;



WebBrowser1.Navigate(ADOQuery1.FieldByName('KeyURL').value);
Delay(10000);
repeat
Application.ProcessMessages;
until (not webbrowser1.Busy);

adoquery1.next;

end;
end;
end;



procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
b:=false;
end;













...全文
87 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lostmoon 2010-02-10
  • 打赏
  • 举报
回复
不 想 用 timer
forestry98 2010-02-10
  • 打赏
  • 举报
回复
看楼主的回复就知道是超级新手。

TTimer 用消息驱动,不比你用 repeat ...... until 循环好吗?
你不用任务管理器看看 Delay 函数延时的时候,你的程序占用的 CPU 有多高!
lostmoon 2010-02-10
  • 打赏
  • 举报
回复
这种情况不好,外层还有一个循环,也会定时器? 那么定时多少呢,
forestry98 2010-02-09
  • 打赏
  • 举报
回复
真大意,要要修改一个地方


procedure TForm1.Timer1Timer(Sender: TObject);
begin
if FIndex < FList.Count then begin
WebBrowser1.Navigate(FList.Strings[FIndex]);
Inc(FIndex);
end else
Timer1.Enabled := False;
end;

forestry98 2010-02-09
  • 打赏
  • 举报
回复
修改了一下

procedure TForm1.Button1Click(Sender: TObject);
begin
FList.Clear;
FIndex := 0;
with ADOQuery1 do begin
SQL.Text := 'select * from keywords';
Open;
while not Eof do begin
FList.Add(FieldByName('KeyURL').value);
Next;
end;
Close;
end;
Timer1.Enabled := True;
end;
forestry98 2010-02-09
  • 打赏
  • 举报
回复
我建议楼主用 TTimer 定时


type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
ADOQuery1: TADOQuery;
WebBrowser1: TWebBrowser;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
FList: TStrings;
FIndex: Integer;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
FList := TStringList.Create;
Timer1.Enabled := False;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FList.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FList.Clear;
FIndex := 0;
with ADOQuery1 do begin
SQL.Text := 'select * from keywords';
ExecSQL;
while not Eof do begin
FList.Add(FieldByName('KeyURL').value);
Next;
end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if FIndex < FList.Count then begin
WebBrowser1.Navigate(FList.Strings(FIndex);
Inc(FIndex);
end else
Timer1.Enabled := False;
end;

end.
发帖
Windows SDK/API

1177

社区成员

Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
帖子事件
创建了帖子
2010-02-09 07:02
社区公告
暂无公告