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

Multithreading 什么会导致具有有限超时的WaitForSingleObject不返回?,multithreading,winapi,c++builder,indy,Multithreading,Winapi,C++builder,Indy,标题说明了一切。我使用C++ Builder使用TIDHTTP> >()来向Internet服务器提交一个表单,以得到响应。由于如果出现网络问题或服务器问题,该调用可能会被卡住,因此我尝试在单独的线程中运行它。当Post()返回时,我用WaitForSingleObject发出等待事件的信号,超时值为1000。有一次,我在超时后处理消息,但现在我只是重复WaitForSingleObject调用,再次超时1000,直到事件发出信号或我的总超时时间(20秒)已过。如果超时已过,我将调用TIdHTT

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

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

当一个C++程序停滞时,我们必须总是考虑内存损坏,我认为这不是事实。暂停总是在WaitForSingleObject调用时出现,如果这是内存损坏问题,我希望至少有时会出现其他问题

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


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

因此,我的问题的答案是“其他东西”。在本例中,我最终找到了我使用的一个库,该库也使用了线程。它与以前版本的RAD Studio一起工作,但禁用该库修复了此问题。我正在移动到该库的当前版本,并将重新测试

我曾经读过关于WFSO导致阻塞的问题,甚至当有太多线程运行()时,睡眠可能永远不会恢复,所以我想可能有一些我不知道的关于线程和WFSO导致阻塞的事情


感谢大家的宝贵意见,这些意见为我指明了正确的方向,特别是雷米·勒博(Remy Lebeau)就如何管理印地大学的课后休息时间提出了建议,他坚持认为。

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