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