IDHttp写得太差了 还是我不用法不当 ( 积分: 100 )

  • 主题发起人 主题发起人 djh_djh
  • 开始时间 开始时间
D

djh_djh

Unregistered / Unconfirmed
GUEST, unregistred user!
目前正在搞一小程序,为了图快用了idhttp

当要下载时,为了保持主线程不被 阻塞, 我另启一线程 调用 idhttp.get

当不想下时, 主线程直接去 disconnect 它, 以达到立即响应用户操作的效果

但不可思议的是 idhttp内面就非法操作了 , 这么大名气的控件 连基本的线程安全

都不能保证,太差了

用得兄弟出点主意
 
目前正在搞一小程序,为了图快用了idhttp

当要下载时,为了保持主线程不被 阻塞, 我另启一线程 调用 idhttp.get

当不想下时, 主线程直接去 disconnect 它, 以达到立即响应用户操作的效果

但不可思议的是 idhttp内面就非法操作了 , 这么大名气的控件 连基本的线程安全

都不能保证,太差了

用得兄弟出点主意
 
>>我另启一线程 调用 idhttp.get 当不想下时, 主线程直接去 disconnect 它
大多数vcl控件都不是线程安全的。建议你在线程中动态创建idhttp,或者用synchronize方法同步
 
synchronize 那都跑到主线程中去执行了
我就是不想让它在主线程中执行
这样的话 idhttp 在 WSSelect 时 主线程什么也做不了

如果 在主线程不直接调Discount,而是发消息给工作线程 那就会在工作线程的队列上串行化, 没法及时响应

因为 工作线程被阻 在 WSSelect 和一个 while中 没法响应用户操作,
一旦网络 不好的情况下 动都动不了了

这个控件写得真是弱智 还不如自己写一个
 
我觉得这个不是id控件的问题,很多地方都有这样的情况
你可以设置超时或者强杀工作线程
 
超时不行 太长了不实时 太短了 Inte网 消息回不出

不过 IDHttp这个控件较弱智 框架还是不错了
我看了一下它的源码, 改了几个override 几个函数就可以了

TMyHttp = class (TIdHttp)
private
procedure ReadBuffer(var ABuffer; const AByteCount: Integer);reintroduce;
public
function Connected: Boolean; override;

function ReadFromStack(const ARaiseExceptionIfDisconnected: Boolean = True;
ATimeout: Integer = 60000;
const ARaiseExceptionOnTimeout: Boolean = True): Integer; override;
 
上当了, 大家以后不要用indy了
这东西性能差, 不稳定
除非只在主线程 内调它的接口,才不会用问题
稍要做复杂一点的工作就不行了.

但是做网络应用, 谁不是搞n个线程的

不知Borland 这么垃圾的东西也放上来做什么 误了我的事

要改它还得大费时间, 上当了

Delphi的数据库控件做得不错, 但是多线程环境下的程序, 调试起来一点也不方便.
老有问题
 
谁说的,你处理上的问题而以!
 
谁有办法在主线程中,立即断开,工作线程中 idhttp 下载,
有没有用得好的哥们。

不行的话,只有有wininet 或自己实现一个http了
 
线程中加方法用DISCONNECT中断就可以,至于那个错误可以自己处理一下。

最好用的还是自己写一个,呵呵
 
DISCONNECT 不行的,
内部有时会出现非法操作 会出现非法指针,
没有办法我发现它这两个函数有问题,就重载了,
可以取消了(不能disconnect 只能 将timeout 设行非常小)

用disconnect 测试100次致少 有10多次非法操作,不是处理异常 ,而是指针非法了

但出现了新的问题,如果网络时断时好的话,或对端拔网线,

它会 不停的抛异常 ,直到调用栈用完
function Connected: Boolean; override;

function ReadFromStack(const ARaiseExceptionIfDisconnected: Boolean = True;
ATimeout: Integer = 60000;
 
用auhttp试试?就是autoUpgrade控件包中带的。
 
auhttp 稳定 快速 indy 垃圾
 
后退
顶部