导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
ihweb (努力学习)
★☆☆☆☆
-
普通会员
2019/5/14 16:33:42
标题:
加入我的收藏
楼主:
线程很好用,抛一个线程,可以不影响整个程序。 线程中包含ftp client,但是远端ftp服务器经常会有网络问题、挂起等问题,从而导致了线程卡住,请问,这情况,如何判断线程卡住,并杀了线程呢?
----------------------------------------------
-
作者:
2019/5/14 17:31:15
1楼:
ftp client设置超时参数呗。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
ihweb (努力学习)
★☆☆☆☆
-
普通会员
2019/5/15 11:39:58
2楼:
网上对于线程的运行判断,都是说用 while not Terminated) do 但是,如果 idftp 卡住了,这个没反应。 另外, indy9的 idftp 超时不起作用的。
----------------------------------------------
-
作者:
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; 重新编译程序运行后,运行两个星期下来没有再碰到假死现象(有异常抛出,被程序捕获后正常运行)。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
2019/5/16 9:13:47
4楼:
新版本找不到上面的代码。说明,新版本就不需要修改。 设计方法变了。 老听大家说 INDY 不稳定,但是我就不知道哪里不稳定。可能是因为我用新版本的原因吧。
----------------------------------------------
(C)(P)Flying Wang
作者:
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才能达到必要的精度。
----------------------------------------------
-
作者:
2019/5/16 15:38:31
6楼:
多谢提醒。
----------------------------------------------
(C)(P)Flying Wang
作者:
2019/5/16 15:55:16
7楼:
这个东东,大版本之间很多不兼容,小版本有时候也会有不兼容。 参数类型,参数个数都经常变化。 有些模块很少更新。
----------------------------------------------
-
作者:
2019/5/16 16:38:19
8楼:
对于Indy的bug,EMBA是不管的,它只负责把Indy集成在Delphi中而已。
----------------------------------------------
-
作者:
2019/5/16 19:30:34
9楼:
之前用Indy的时候遇到内存泄漏,查源码,查到泄漏的地方有注释明确说有内存不会释放,晕死……
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
ihweb (努力学习)
★☆☆☆☆
-
普通会员
2019/5/17 12:52:46
10楼:
大家展开好激烈的谈论。 有人说升级到 Indy10,我也试过,升级了,好多老代码就开始不兼容,又得劈里啪啦修改一通。 最后,我将IdFTP改用ICS的FTP控件,非阻塞式,测试良好。
----------------------------------------------
-
作者:
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 还是不行,中断时可以,但是不释放内存。
----------------------------------------------
-