【问题标题】:What would cause WaitForSingleObject with finite timeout not to return?什么会导致具有有限超时的 WaitForSingleObject 不返回?
【发布时间】:2014-07-06 16:09:29
【问题描述】:

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

但是,尽管它通常可以正常工作,但我无法让它可靠地工作。我正在使用 CodeSite 记录进度,我可以看到,有时会调用 WaitForSingleObject,但不会(永远)返回。由于在主线程上调用 WaitForSingleObject,因此应用程序在被终止之前没有响应。

当 C++ 程序停止运行时,人们必须总是想到内存损坏,但我不认为这是正在发生的事情。停顿总是在 WaitForSingleObject 调用,如果是内存损坏问题,我预计至少有时会出现其他问题。

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

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

【问题讨论】:

  • 它应该返回。我们可以有一个 SSCCE。
  • 当然,这就是问题所在——它是一个更大的应用程序的一部分,它正在做很多事情。让我把它分解成一个 SSCCE。
  • 没有 SSCCE 的帖子几乎毫无意义
  • 我能想到的唯一一件事就是你实际上有一些与你期望的不同的东西。例如,您提供了导致访问冲突等异常的错误参数,并且应用程序由于其他原因而冻结。由于无法注意到这一点,您提出了一个本身没有答案的问题,并且最终对您的情况没有真正的帮助。
  • 我在 Windows 7 上看到了 WaitForSingleObject() 的奇怪行为。有时我使用 WFSO() 等待 TThread 完成终止,即使 TThread 自己调用 ExitThread()正确地,WFSO() 有时无法正确退出,就好像线程句柄没有正确发出信号一样。让我想知道WFSO() 本身是否存在在特定条件下触发的潜在错误。

标签: multithreading winapi c++builder indy


【解决方案1】:

所以,我的问题的答案是“别的东西”。在这种情况下,我终于找到了我正在使用的一个库,该库也使用了线程。它适用于以前版本的 RAD Studio,但禁用该库可解决此问题。我正在迁移到该库的当前版本并将重新测试。

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

感谢大家的帮助,他们为我指明了正确的方向,尤其感谢 Remy Lebeau 提出的关于使用 Indy 管理 Post 超时的建议,他坚持这样做。

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2016-10-09
    相关资源
    最近更新 更多