我有一个数据转储文件,里面有不同的时间戳数据,我从时间戳得到时间,然后睡觉我的c线程。但问题是实际时间差是10秒,而我在接收端收到的数据差不多是14,15秒延迟。我正在使用Windows OS。请指导我。
对不起我的一周英语。
答案 0 :(得分:3)
睡眠功能至少会在您指定的时间内休眠,但无法保证它不会长时间睡眠。如果您需要准确的间隔,则需要使用其他一些机制。 / p>
答案 1 :(得分:2)
如果我理解得很好:
如果上面描述了你在做什么,你的设计有几个缺陷:
如果您提供更多详细信息,则可以更轻松地诊断问题的根源。 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任务计划程序,但这不在程序化的独立选项之外。