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

时间:2014-05-18 18:05:29

标签: multithreading winapi c++builder indy

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

然而,我无法让它可靠地工作,尽管它通常有效。我正在使用CodeSite来记录进度,我可以看到,有时会调用WaitForSingleObject,但不会返回(永远)。由于在主线程上调用了WaitForSingleObject,因此应用程序无响应,直到它被杀死。

虽然在C ++程序停止时必须始终考虑内存损坏,但我不认为这是正在发生的事情。停止总是在WaitForSingleObject调用,如果它是一个内存损坏问题,我希望,至少有时,其他东西会出错。

WaitForSingleObject的MSDN页面说计算机处于睡眠状态时计时器不会倒计时,显示器会在一段时间后变为空白,但计算机会继续运行,并且无论如何WaitForSingleObject都不会返回鼠标移动,显示器重新开启。

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

1 个答案:

答案 0 :(得分:0)

所以,我的问题的答案是“其他东西”。在这种情况下,我最终将它追溯到我正在使用的也使用了线程的库。它与之前版本的RAD Studio一起使用,但禁用该库修复了此问题。我正在转移到该库的当前版本并将重新测试。

我读过有关WFSO导致阻塞的问题,甚至在有太多线程运行(http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx)时睡眠可能永远不会返回的地方,所以我想可能有些东西我不知道线程和WFSO造成这种情况。

感谢大家的有益评论,这些评论指出了我正确的方向,尤其是雷米·勒博(Remy Lebeau)提出的关于管理与Indy合作的帖子超时的建议。