我在使用约Idhttp.Get
方法时遇到了一些问题。我认为它默认工作在阻塞模式(等待答案转到下一行),但我只是看到它不等待答案转到另一行。我正在使用它与线程,但我认为这不是问题。代码是:
PbxURL = http://www.biyiklikadin.com;
IdHTTP1:= TIdHttp.Create(Application);
IdHTTP1.ConnectTimeout:= 10000;
IdHTTP1.Request.Clear;
IdHTTP1.Request.BasicAuthentication:= true;
try
IdHTTP1.Get(PbxURL); **//this should STOP here and wait for answer don't?**
HttpCode:= IdHTTP1.ResponseCode;
except
on E: EIdHTTPProtocolException do
HttpCode := IdHTTP1.ResponseCode;
end;
if HttpCode=200 then
Memo1.Lines.Append('Kızlık Bozma');
所以,我只是注意到我没有得到正确的HttpCode
值,因为在'Get'方法之后,它只是继续执行而不等待'Get'完成。我该如何解决这个问题?
答案 0 :(得分:3)
Indy使用阻塞套接字调用,并执行阻塞操作。如果发生错误,仅方式TIdHTTP.Get()
将不会等待响应。您只捕获一种类型的错误(服务器错误),但可能会发生其他类型的错误(套接字错误,内存/ rtl错误等)。并且无需测试响应代码以了解Get()
是成功还是失败。引发异常的事实意味着它失败了。
try
IdHTTP1.Get(PbxURL);
// succeessful
except
on E: EIdHTTPProtocolException do begin // <-- only raised if the server sends an error reply
// do something...
end;
on E: Exception do begin // <-- any other error
// do something else ...
end;
end;
另外,您说您在线程中使用此代码。您对Application
和Memo1
的使用不是线程安全的。取消Application
作为所有者,改为使用nil
所有者,Free()
使用TIdHTTP
。并使用TThread.Synchronize()
/ TThread.Queue()
或TIdSync
/ TIdNotify
或任何其他线程间通信方法安全地更新备忘录。 TIdAntiFreeze
对在主UI线程之外执行的Indy操作没有影响。
答案 1 :(得分:2)
Indy 阻止。从可下载的文档here(Indy10.pdf):
Indy使用阻塞套接字调用。 ...例如,简单地连接 调用connect方法并等待它返回。如果成功,那就是 它会在它返回时返回。如果失败,则会引发异常。
在评论中,有人认为TIdAntiFreeze
可能会影响Indy电话的阻止性质。再次来自文档:
Indy有一个解决用户界面冻结的特殊组件 透明的问题。只需在您的任何位置添加一个TIdAntiFreeze即可 应用程序,您可以在您的应用程序中执行标准阻止Indy调用 没有冻结用户界面的程序。
TIdAntiFreeze通过内部超时调用堆栈来工作 并在超时期间调用Application.ProcessMessages。 外部 对Indy的调用继续阻止,因此完全没有a 否则TIdAntiFreeze 。使用TIdAntiFreeze可以满足所有需求 阻塞插座的优点,没有最突出的 缺点
您的问题没有为进一步分析提供足够的信息。