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

Multithreading 停止Delphi Indy线程而不必等待结束超时,multithreading,delphi,indy,Multithreading,Delphi,Indy,这是我第一次用Delphi开发多线程应用程序,所以对我来说一切都很快,但我读了很多书 我的线程很简单,简而言之,我只是使用Indy(IdHTTP)获取网页的内容,然后验证内容是否包含字符串。这里没问题 现在,为了终止线程,我使用了一个带有whiledo的布尔值。它似乎在工作,但问题是:就像我对Indy使用超时一样,有时我必须在线程完成之前等待超时时间的结束(例如,当服务器没有响应时) 这很烦人,尤其是当我使用+200线程时。对于其他使用多线程和类似过程的软件,当我单击“停止”时,所有程序都会在几

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

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

现在,为了终止线程,我使用了一个带有whiledo的布尔值。它似乎在工作,但问题是:就像我对Indy使用超时一样,有时我必须在线程完成之前等待超时时间的结束(例如,当服务器没有响应时)

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

我读到我应该使用防冻剂,以允许IdHTTP“阅读我的说明”

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

提前感谢您提供的灯光:)


Beny

我在使用Indy和WebService时遇到了类似的问题,我们讨论的系统最多也不可靠(我不得不为一些电话设置30分钟的读取超时)

由于Rio调用(以及您的IdHTTP)正在阻止您的进程,因此无法直接取消/中止它们

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

我已经做了一个快速的黑客测试,只使用了TIdHTTP,它似乎和Rio一样工作

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

我使用了Delph 7和INDY10,以防与您的设置不同

希望有帮助

顺便说一句


如果有人知道一种更好的/不那么激进的方法,我也希望看到。

这个类
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的阶段是随机的。该事件可以在请求的中途、乞讨时甚至最后调用。上述代码的工作方式与按浏览器上的“停止”按钮相同

[更新]
忘记提一下,如果在挂起线程等待服务器回复时没有调用then OnWork事件,那么如果“last response”是在指定的毫秒前收到的,则使用可以使用超时。为此使用
GetTickCount

为什么要停止GET?你为什么要终止他们?不要靠近防冻液。例如,如果过程太长。我希望能够随时中止该程序。就像“杀死”线程一样,当然是以一种安全的方式。谢谢本耶,真有趣!我试试看。谢谢你的意见。贝尼索,自从我第一次发帖后,我就把印第换成了ip*作品。一切都保持不变,我只是尝试实现一个
HTTP.Interrupt。因此,当单击“停止”时,我中止了新线程的创建,但我不知道在哪里可以放置我的代码来中断已经启动的线程……经过长时间的研究,您似乎找到了正确的解决方案。再次感谢你!最好的。Beny;)@ChristopherRamírez-谁在OnHTTPProgress中中止?@SolarWind:
Abort()
SysUtils
单元中的一个函数。感谢您提出断开IdHTTP连接的想法。我只是有点想知道如何放置已经开始的代码断开连接线程:s Beny