DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jsuguo
今日帖子: 27
在线用户: 23
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 ihweb (努力学习) ★☆☆☆☆ -
普通会员
2019/5/14 16:33:42
标题:
关于线程的中断问题。 浏览:1449
加入我的收藏
楼主: 线程很好用,抛一个线程,可以不影响整个程序。

线程中包含ftp client,但是远端ftp服务器经常会有网络问题、挂起等问题,从而导致了线程卡住,请问,这情况,如何判断线程卡住,并杀了线程呢?
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/5/14 17:31:15
1楼: ftp client设置超时参数呗。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 ihweb (努力学习) ★☆☆☆☆ -
普通会员
2019/5/15 11:39:58
2楼: 网上对于线程的运行判断,都是说用
while not Terminated) do

但是,如果 idftp 卡住了,这个没反应。

另外, indy9的 idftp 超时不起作用的。
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/5/15 16:27:35
3楼: 好吧,IdFtp写得不是很好,传输过程中被拦截的话会出现异常卡死,解决办法是用其它组件,或修改源代码。
下面给你贴一段网上找到的代码,原网站不能访问,贴的是百度快照:

IdFtp传输数据假死Bug修正
sunnyu 2014-05-11 382 阅读
LAMP

一个使用IdFtp做文件上传的服务最近常有假死现象,查看程序逻辑,没有问题,对IdFtp控件也设置了connecttimeout和readtimeout超时时间,但是传输过程中仍然有未抛出异常的假死,怀疑是IdFtp的传输有bug。
根据FTP主动模式原理,客户端需开一个随机端口与服务器进行数据传输,此时如果防火墙未对这些端口放开则会被拦截,程序被拦截后本次ftp传输会失败。当使用IdFtp控件进行ftp传输时,这里一旦被拦截,ftp操作所在线程会假死,具体位置就是在ftp传输过程中,创建的侦听端口的服务后,是while死循环等待服务端应答,没有超时退出机制。
IdFtp内部使用TIdSimpleServer开启端口侦听等待服务端相应,这就需要对这个文件做补丁处理,将IdSimpleServer.pas拷贝到工程目录下,加入到工程中,然后修改Listen函数如下这段

    while (FAbortedRequested = False) and (Result = False) do begin
    Result := Readable(AcceptWait); // 如果被防火墙拦截,服务端的请求就不会连接过来,于是这儿就处于死循环,假死因此而产生
    end;

修改为

    dBeginTime := Now;
    while (FAbortedRequested = False) and (Result = False) do begin
    Result := Readable(AcceptWait);
    if (Now – dBeginTime) * 24 * 3600 * 1000 > ReadTimeOut then // 添加等待超时跳出条件,这儿用读超时时间
    Break;
    end;

重新编译程序运行后,运行两个星期下来没有再碰到假死现象(有异常抛出,被程序捕获后正常运行)。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2019/5/16 9:13:47
4楼: 新版本找不到上面的代码。说明,新版本就不需要修改。
设计方法变了。
老听大家说 INDY 不稳定,但是我就不知道哪里不稳定。可能是因为我用新版本的原因吧。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2019/5/16 14:39:41
5楼: indy我用的不多,但已经碰到了两个Bug,而且Indy最新版本都还没修正:
(1)idftp如果用了压缩方式下载,有时会报Z_BUF_ERROR。其实这只是一个警告,不是一个错误,但idftp没有处理好。
(2)IdIcmpClient.Ping的时间精度只有10-16ms,原因是计算时延用了Windwows Api函数GetTickCount函数,而这个函数的时间精度只有10-16ms。应该使用QueryPerformanceCounter才能达到必要的精度。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2019/5/16 15:38:31
6楼: 多谢提醒。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 hdcopy (hdcopy) ★☆☆☆☆ -
普通会员
2019/5/16 15:55:16
7楼: 这个东东,大版本之间很多不兼容,小版本有时候也会有不兼容。
参数类型,参数个数都经常变化。
有些模块很少更新。
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2019/5/16 16:38:19
8楼: 对于Indy的bug,EMBA是不管的,它只负责把Indy集成在Delphi中而已。
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/5/16 19:30:34
9楼: 之前用Indy的时候遇到内存泄漏,查源码,查到泄漏的地方有注释明确说有内存不会释放,晕死……
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 ihweb (努力学习) ★☆☆☆☆ -
普通会员
2019/5/17 12:52:46
10楼: 大家展开好激烈的谈论。
有人说升级到 Indy10,我也试过,升级了,好多老代码就开始不兼容,又得劈里啪啦修改一通。

最后,我将IdFTP改用ICS的FTP控件,非阻塞式,测试良好。
----------------------------------------------
-
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2019/5/17 13:49:51
11楼: 在网络方面使用线程,是会遇到这样的问题,我已经不使用Terminated好久了
之前在程序退出时,断开连接,停止线程接收或发送,用Terminated+waitefor,经常是出错或卡住不动,现在我是下面这样用:
procedure THCRThread.Execute;
begin
  while not FOver do
  begin
    DoExecute;
    Sleep(1);
  end;
end;
----------------------------------------------
18114532@qq.com
作者:
男 ihweb (努力学习) ★☆☆☆☆ -
普通会员
2019/5/17 14:26:58
12楼:
在网络方面使用线程,是会遇到这样的问题,我已经不使用Terminated好久了



我和你一样,开始网上看到勇 Terminated,后来发现各种报错。
最后自己写判断,超时,就 abort 了 ftp ,然后 free 了他,再正常结束线程,更好更安全。
----------------------------------------------
-
作者:
男 ihweb (努力学习) ★☆☆☆☆ -
普通会员
2019/5/21 16:22:07
13楼: 替换了 ICS FTP 还是不行,中断时可以,但是不释放内存。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行85.9375毫秒 RSS