什么会导致有限超时WaitForSingleObject不返回?

标题说明了一切。 我正在使用C ++ Builder使用TIdHTTP-> Post()向Internet服务器提交表单以获取响应。 由于该调用可能会卡住,如果有网络问题或服务器问题,我试图在一个单独的线程中运行它。 当Post()返回时,我用WaitForSingleObject指示Event等待的事件,使用超时值1000.有一次,我在超时后处理消息,但现在我只是重复WaitForSingleObject调用,超时1000,直到事件发出信号或我的总超时时间(20秒)已过。 如果超时超时,我会在TIdHTTP上调用Disconnect()并重试。

但是,我一直无法得到这个工作可靠,虽然它通常工作。 我正在使用CodeSite记录进度,我可以看到有时会调用WaitForSingleObject,但不会返回(永远)。 由于在主线程上调用WaitForSingleObject,应用程序在被终止之前无响应。

当一个C ++程序停顿时,必须总是想到内存损坏,但我不认为这是怎么回事。 失速总是在WaitForSingleObject调用,如果这是一个内存损坏问题,我会期望,至少有时候,别的东西会出错。

WaitForSingleObject的MSDN页面说计时器在计算机休眠时不会倒计时,并且显示器在一段时间后变为空白,但计算机继续运行,并且在任何情况下,一旦移动鼠标,WaitForSingleObject就不会返回并且显示器重新打开。

所以,再次,我的问题。 什么可能导致WaitForSingleObject与有限超时(1000 msecs)永不返回?


所以,我的问题的答案是“别的东西”。 在这种情况下,我终于把它跟踪到了我正在使用的库,也使用了线程。 它与以前版本的RAD Studio一起工作,但禁用该库解决了这个问题。 我正在转向该库的当前版本,并将重新进行测试。

我已经读过WFSO导致块的问题,甚至在睡眠可能永远不会返回的情况下,如果线程运行太多(http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs) .85).aspx),所以我认为可能有一些我不知道的线程和WFSO造成这种情况。

感谢大家提供的有用评论,这些评论向我指出了正确的方向,尤其是对Remy Lebeau提出的有关Indy管理Post超时的建议。

链接地址: http://www.djcxy.com/p/62477.html

上一篇: What would cause WaitForSingleObject with finite timeout not to return?

下一篇: SetThreadExecutionState preventing manual sleep