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



这是我第一次用Delphi开发多线程应用程序,所以对我来说一切都很顺利,但我读了很多书。

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

现在,为了终止线程,我在WHILE DO中使用了一个布尔值。它似乎有效,但问题是:就像我在Indy中使用Timeout一样,有时我必须等待超时期结束后线程才能完成(例如,当服务器没有响应时)。。。

这很烦人,尤其是当我使用+200线程时。对于其他使用多线程和类似过程的软件,当我点击"停止"时,所有操作都会在几秒钟内停止,这就是我所需要的。

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

所以,我在这里有点迷路了。我认为这不是很必要,但这是我的代码:http://pastebin.com/G7De8bgb

提前感谢灯光:)

Beny

TidHTTP有一个OnWork事件。使用此事件可取消数据下载或上传。如何取消此活动?引发中止静默异常。

这是一个伪代码:

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;

考虑到调用OnWork的阶段是随机的。该活动可以在请求的中途、乞求时甚至最后调用。上面的代码将像按下浏览器上的停止按钮一样工作。

[更新]忘了提一下,如果在线程挂起等待服务器的回复时没有调用thenOnWork事件,那么如果在指定的毫秒前收到"最后一个响应",则使用可以使用超时。使用GetTickCount

我在使用Indy和Web服务时也遇到过类似的问题,我们谈论的系统充其量也不可靠(我不得不为一些呼叫设置30分钟的读取超时)。

由于Rio Calls(和您的IdHTTP)调用被阻止,您不能直接取消/中止它们。

但是,您可以(如果使用不同的线程)断开底层套接字的连接,这将在get/webcall中导致异常。

我做了一个快速破解,只使用TIdHTTP来测试这个想法,它似乎和Rio一样有效。

在主/控制线程中,您需要调用IDHTTP.Disconnect,然后捕获将在线程中引发的异常。通过查看代码,您将在Thread.Execute中创建IdHTTP,您必须将其声明移动到类的构造函数中,以允许线程类上的Abort函数简单地断开套接字。

我使用了Delph 7和INDY10,只是为了防止与您的设置不同。

希望能帮助

BTW

如果有人知道一种更好/不那么激烈的方法,我也很乐意看到。

最新更新