C中的睡眠功能错误

时间:2010-05-28 07:58:42

标签: c++ c windows

我有一个数据转储文件,里面有不同的时间戳数据,我从时间戳得到时间,然后睡觉我的c线程。但问题是实际时间差是10秒,而我在接收端收到的数据差不多是14,15秒延迟。我正在使用Windows OS。请指导我。

对不起我的一周英语。

5 个答案:

答案 0 :(得分:3)

睡眠功能至少会在您指定的时间内休眠,但无法保证它不会长时间睡眠。如果您需要准确的间隔,则需要使用其他一些机制。 / p>

答案 1 :(得分:2)

如果我理解得很好:

  • 你有一个发送数据的线程(通过网络?什么是数据来源?)
  • 你减慢使用睡眠发送节奏
  • 收到的数据(在网络的另一端)可以延迟更多(15秒而不是10秒)

如果上面描述了你在做什么,你的设计有几个缺陷:

  • 睡眠非常不精确,它会等待至少n秒,但可能会更多(特别是如果您的系统被其他正在运行的应用程序加载)。
  • 网络引入了缓冲延迟,您无法保证您的数据会立即通过网络发送(通常不会)。
  • 行程本身会引入一些延迟(延迟),如果您的协议等待来自接收端的ACK,您应该考虑到这一点。
  • 您还应该考虑读取/构建/检索要发送的数据所需的时间,并通过网络发送它。根据你正在做的事情,这可以忽略不计或需要几秒钟......

如果您提供更多详细信息,则可以更轻松地诊断问题的根源。 sleep正如您所认为的(它确实是一个非常糟糕的计时器)或您系统的其他部分。

如果您的转储很大,我敢打赌额外的时间来自读取数据并通过网络发送。您应该确定发送过程中消耗的时间(完成发送之前和之后的阅读时间)。

如果这确实是额外时间的来源,您只需要在下次等待时删除该时间。

示例:发送上一个数据块需要4s,下一个块是10s之后,但是当你已经消耗了4s时,你只需要等待6s。

sleep仍然是一个非常不精确的计时器,显然如果发送时间大于发送之间的延迟,上述机制将不起作用,但你明白了。

更正在Windows环境中睡眠并不像在unix中那样糟糕。 Windows睡眠的准确度是毫秒,unix睡眠的准确度是第二。如果您不需要高精度定时(如果涉及网络,则高精度定时无论如何都是不可及的)睡眠应该没问题。

答案 2 :(得分:1)

任何现代多任务操作系统的调度程序都不能保证任何用户应用程序的准确计时。 您可以尝试以某种方式为您的应用分配“实时”优先级,例如,从Windows任务管理器。看看它是否有帮助。

另一个解决方案是实现“受控”睡眠,即睡眠一系列500毫秒,检查它们之间的当前时间戳。所以,如果你的所有人都会在某个步骤睡1秒而不是500毫秒 - 你会注意到它而不是额外的睡眠(500毫秒)。

答案 3 :(得分:0)

试用Multimedia Timer。它与Windows系统一样准确。 CodeProject上有一个关于它们的好article

答案 4 :(得分:0)

睡眠功能可能比请求的时间更长,但永远不会少。使用winapi计时器函数从现在开始在一个区间内调用一个函数。

您也可以使用Windows任务计划程序,但这不在程序化的独立选项之外。