【发布时间】: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