停止Delphi Indy线程而不必等待超时Timeout

Ben*_*eny 3 delphi multithreading indy

这是我第一次使用Delphi处理多线程应用程序,所以对我来说仍然很好,但我读了很多.

我的线程很简单,简而言之我只是使用Indy(IdHTTP)来获取网页的内容,然后我验证内容是否包含字符串.这里没问题.

现在,为了终止线程,我使用带有WHILE DO的布尔值.它似乎有效但问题就在于:就像我在Indy中使用Timeout一样,有时我必须等待线程结束前的超时时间结束(例如服务器没有响应时)...

这很烦人,特别是当我使用+200线程时.使用其他软件使用多线程和类似的程序,当我点击"停止"时,所有都在几秒钟内停止,这就是我需要的.

我读到我应该使用AntiFreeze,以允许IdHTTP"阅读我的指示"......

所以,我在这里有点迷失.我不认为这是非常必要的,但这是我的代码:http://pastebin.com/G7De8bgb

在此先感谢灯光:)

贝尼

Chr*_*rez 6

这堂课TidHTTP有一个OnWork活动.使用此事件取消数据下载或上传.如何取消此活动?解雇Abort无声的异常.

这是一个伪代码:

THTTPThread = class(TThread)
    private
        HTTPComponent: TidHTTP;
        procedure OnHTTPProgress(ASender: TObject; AWorkMode: TWorkMode;
                                     AWorkCount: Int64);
    published
        procedure execute();
end;

implementation
procedure THTTPThread.execute;
begin
    Self.HTTPComponent := TidHTTP.Create(nil);
    with HTTPComponent do
    begin
        OnWork := Self.OnHTTPProgress;
        Get('http://www.google.com');
    end;
end;

procedure THTTPThread.OnHTTPProgress(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin

    if Self.Terminated then
        Abort;
end;
Run Code Online (Sandbox Code Playgroud)

考虑到调用OnWork的阶段是随机的.事件可以在请求的中间,乞讨甚至结束时调用.上面的代码就像按下浏览器上的停止按钮一样.

[更新]忘记提一下,如果当线程被挂起以回复服务器时未调用OnWork事件,则如果在指定的毫秒之前收到"最后一个响应",则使用可以使用超时.使用GetTickCount此.