- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发游戏服务器,它是用C写的。我需要以一定的频率(每秒50次)开发一个周期执行算法。问题是我无法将程序暂停一个确切的时间间隔 - 20000 微秒。函数 usleep(20000)
运行大约 30000 微秒。结果总是比预期多 10000 微秒。
这是我的简单代码示例:
#include <stdio.h>
#include <time.h>
#include <unistd.h>
int main( int argc, char ** argv )
{
const unsigned long long nano = 1000000000;
unsigned long long t1, t2;
struct timespec tm;
for(;;)
{
clock_gettime( CLOCK_REALTIME, &tm );
t1 = tm.tv_nsec + tm.tv_sec * nano;
usleep( 20000 );
clock_gettime( CLOCK_REALTIME, &tm );
t2 = tm.tv_nsec + tm.tv_sec * nano;
printf( "delay: %ld\n", ( t2 - t1 ) / 1000 );
}
return 0;
}
运行结果:
$ ./a.out
delay: 29233
delay: 29575
delay: 29621
delay: 29694
delay: 29688
delay: 29732
delay: 29709
delay: 29706
delay: 29666
delay: 29702
delay: 29702
delay: 29705
delay: 29789
delay: 29619
delay: 29785
delay: 29634
delay: 29692
delay: 29708
delay: 29701
delay: 29703
我也尝试使用函数 select()
,但结果与 sleep()
相同。
请向我解释一下,我的代码有什么问题。
附:
$ uname -a
FreeBSD home.com 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan 3 07:46:30 UTC 2012 root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64
最佳答案
基于对 clock_gettime 的调用,不是休眠 20000 useconds,而是休眠剩余的时间直到你想再次运行
即:
usleep( lasttime+20000-now ); // But make sure you don't sleep when the result is negative
不是你的代码有问题,而是实际调用sleep,读取时间等都需要时间,而且系统无论如何也休眠不了准确的时间,除非是它的准确时钟的倍数周期
关于c - C. usleep 的时间延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12777254/
我在使用以下代码时遇到问题。 //Send Creation email ListServDAO.sendCreateEmail(orgId, full, request.getSession().g
我想知道如何在一段时间后调用函数。我试过 time.sleep() 但这会停止整个脚本。我希望脚本继续运行,但在 ???secs 后调用一个函数并同时运行另一个脚本 最佳答案 看看threading.
我有一个在 .NET 4.0 中使用的自定义控件(继承自 TextBox)。 我需要做的是在用户完成输入后执行一些代码,例如他停止打字后一秒钟。 为了提高效率,我不能在每次 Text 更改时都执行此代
我目前正在开发一个应用程序,我想实现一个时间延迟。我不想使用 System.Threading.Thread.Sleep(x);当我读到这篇文章时,线程停止了(UI 卡住) 我目前写的代码是: pub
我需要一些关于我调用 onKeyUp 的 JavaScript 函数的帮助,它是一个 Ajax 函数,但每次我写任何字符时它都会调用该函数并且它会降低页面性能并且它每次都会检查,它是一个用户检查数据库
我想在 PyDev (Eclipse) python 2.75 中创建一个图形窗口。 我做了一些事情,但我想做一个“入口”“眨眼”。它测试用户输入。如果它是一个整数,它应该闪烁绿色一秒钟,然后变成白色
再次嗨,网络大师:)现在,我有一个新的愚蠢问题,我请求原谅。我到处阅读有关此解决方案的信息,但没有找到适合我的解决方案。 我有: 我要问的是如何使其不在按下按钮后进行检查,而是在键盘不活动 1000
我通过了几种导致时间延迟的方法,例如 pings 和 dirs。虽然它们都不是真正精确的,但有没有适当的方法来导致时间延迟? 我听说了一些东西,尽管它们不适用于所有计算机,不适用于我的 Windows
这个问题在这里已经有了答案: Simple C app using 50% cpu (6 个答案) 关闭 8 年前。 我尝试使用 ncurses 库和 C 编写一个 CUI Snake 游戏。一切正
我写了一个带有时间延迟的源代码。在 unix 中我使用了 #include 头文件和 usleep功能。 在 Windows 上这相当于什么? 在windows上写同样的代码应该用什么库和函数 最佳答
我正在尝试让我的 JButton 在我正在创建的游戏中闪烁红色。该网站上的所有解决方案都建议使用线程并将其置于 sleep 状态或使用计时器,但是,暂停缓解似乎是在颜色更改之后发生的 这是我的代码:
我正在使用 Javascript 和 HTML5 CANvas 制作动画。如何在 for 循环中实现延迟(非阻塞)?我想确保在延迟结束之前不会绘制第二条线。 for (i=1;i
我正在尝试让我的 JButton 为我正在创建的游戏闪烁红色。该网站上的所有解决方案都建议使用线程并将其置于 sleep 状态或使用计时器,但是,暂停似乎是在颜色变化之后出现的 这是我的代码: Col
我正在使用 Node.js(v0.12.4) 和 Socket.io(1.3.2) 开发实时交易应用程序。在那方面,当从 Node.js 向 GUI(Socket.Io) 发出响应时,我面临将近 (1
我试图弄清楚如何在 Excel VBA 中使用时间延迟。 这是我想做的事情: 我在宏中有一个按钮,当我单击它时,它会发送第一封电子邮件。然后 1 小时后,我想自动发送第二封电子邮件,而无需单击另一个按
我是一名优秀的程序员,十分优秀!