[讨论]延时函数以及时间的获取

[讨论]延时函数以及时间的获取

帖子523066680 » 2012-03-18 15:13


我个人大多在这两个平台编译C程序: winxp下的MinGW ,ubuntu下直接gcc ,
延时函数经常用time.h中的usleep ,但是一直没注意这个函数的属性,只是给
一个合适的参数。

函数参考
http://linux.die.net/man/3/usleep
http://linux.die.net/man/3/clock
http://linux.die.net/man/2/time

延时
    int usleep(useconds_t usec);
    精度为百万分之一秒
    调用范围在0-1000000(一百万)之间,闭区间。 如果超出范围返回错误值。
    也就是可调用的最大数值为999999 (一秒,可能有误差,但是不大)

查看时间变化:
    #include <time.h>
    clock_t clock(void);

    Return Value
    The value returned is the CPU time used so far as a clock_t;
    to get the number of seconds used, divide by CLOCKS_PER_SEC.
    大致意思: 返回的值是CPU使用的时间(程序启动运行的时间开始计时),精度
    是千分之一秒。如果需要以秒为单位,请将这个数值除以常量 CLOCKS_PER_SEC
    ,这个常量的值通常是1000。
获取当前时间
    #include <time.h>
    time_t time(time_t *t);
    如果以NULL 调用time 得到的就是一个未规格化的数值。精确到秒。
    例如:1332054095

做一个示例
代码: 全选
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
   int i,re;
   time_t t;
   printf("CLOCKS_PER_SEC value:%d\n",CLOCKS_PER_SEC);
   while (1)
   {
      t=time(NULL);
      printf("clock: %d \t seconds: %.3f time:%d\n",
         clock(),
         (float)clock()/CLOCKS_PER_SEC,
         t);
      usleep(999999);
   }
   return 0;
}


执行显示
代码: 全选
CLOCKS_PER_SEC value:1000
clock: 15        seconds: 0.015 time:1332054717
clock: 1015      seconds: 1.015 time:1332054718
clock: 2015      seconds: 2.015 time:1332054719
clock: 3015      seconds: 3.015 time:1332054720
clock: 4015      seconds: 4.015 time:1332054721
clock: 5015      seconds: 5.015 time:1332054722



获取时间的年/月/日/时/分/秒形式

    使用函数 time,localtime , asctime
代码: 全选
/*
函数名: localtime
功  能: 把日期和时间转变为结构
用  法: struct tm *localtime(long *clock);
程序例: */
#include <time.h>
#include <stdio.h>
#include <dos.h>

int main(void)
{
   time_t timer;
   struct tm *tblock;
   /* gets time of day */
   timer = time(NULL);

   /* converts date/time to a structure */
   tblock = localtime(&timer);

   printf("Local time is: %s", asctime(tblock));
   return 0;
}

执行显示:Local time is: Sun Mar 18 15:48:43 2012
tm 结构体 原型:
代码: 全选
struct tm
{
   int   tm_sec;      /* Seconds: 0-59 (K&R says 0-61?) */
   int   tm_min;      /* Minutes: 0-59 */
   int   tm_hour;   /* Hours since midnight: 0-23 */
   int   tm_mday;   /* Day of the month: 1-31 */
   int   tm_mon;      /* Months *since* january: 0-11 */
   int   tm_year;   /* Years since 1900 */
   int   tm_wday;   /* Days since Sunday (0-6) */
   int   tm_yday;   /* Days since Jan. 1: 0-365 */
   int   tm_isdst;   /* +1 Daylight Savings Time, 0 No DST,
             * -1 don't know */
};

最后由 523066680 编辑于 2012-03-18 16:03,总共编辑了 7 次
论坛已转移 Code-By.Org 群号 322023604
头像
523066680
版主
 
帖子: 1680
注册: 2012-03-06 15:08

Re: [讨论]延时函数以及时间的获取

帖子523066680 » 2012-03-18 15:17

参考文章:
Linux 高精確的時序(sleep, usleep,nanosleep)
http://blog.chinaunix.net/space.php?uid ... &id=189224

4. 高精確的時序
http://blog.chinaunix.net/link.php?url= ... ing-4.html
论坛已转移 Code-By.Org 群号 322023604
头像
523066680
版主
 
帖子: 1680
注册: 2012-03-06 15:08

Re: [讨论]延时函数以及时间的获取

帖子tsuui » 2012-04-07 16:01

看到glut的很多例子里, 都在idle函数里用usleep调整帧速,在minGW里跑出来的效果跟linux下是一致的?
怀疑。。。线程模型不一样,linux下可能会既降低cpu占用又调整帧速?win下却会大大降低帧速

难道是glut实现导致的?还是usleep本身不同于win下的sleep?求指点
tsuui
中级会员
中级会员
 
帖子: 33
注册: 2012-03-19 22:50

Re: [讨论]延时函数以及时间的获取

帖子523066680 » 2012-05-11 0:14

继续总结:
如果在linux下编译第一个实例,发现提示错误(虽然编译的程序照常运行)
或者用mingw编译加上 -Wall 参数,将提示
a.c:13:11: warning: format '%d' expects type 'int', but argument 2 has type 'clock_t'
a.c:14:11: warning: format '%d' expects type 'int', but argument 2 has type 'time_t'

翻了一下time.h
/*
* A type for measuring processor time (in clock ticks).
*/
#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif


原来clock_t也是长整形的
只要把 printf里面的格式化参数%d 改成%ld 问题就消失了

至于time_t 为什么也是ld,我也不想花太多时间来着……
还是查了一下,首先time.c中:
#ifndef _TIME_T_DEFINED
/* FIXME __STRICT_ANSI__ ! */
#if __MSVCRT_VERSION__ >= 0x0800
#ifndef _USE_32BIT_TIME_T
typedef __time64_t time_t;
#else
typedef __time32_t time_t;
#endif /* !_USE_32BIT_TIME_T */
#else
typedef __time32_t time_t;
#endif /* __MSVCRT_VERSION__ >= 0x0800 */
#define _TIME_T_DEFINED
#endif


接下来查 __time32 的底细
C:\MinGW\include>findstr "__int32" *.h
basetsd.h:#define __int3264 __int64
basetsd.h:#define __int3264 __int32
basetyps.h:# ifndef __int32
basetyps.h:# define __int32 long
io.h: __int32 size;
io.h: __int32 size;
io.h: __int32 size;
io.h: __int32 size;
time.h:typedef __int32 __time32_t;
wchar.h: __int32 size;
wchar.h: __int32 size;
wchar.h: __int32 st_size;
wchar.h: __int32 st_size;
_mingw.h:# ifndef __int32
_mingw.h:# define __int32 long
_mingw.h:# ifndef __int32
_mingw.h:# define __int32 long


果然也是long
论坛已转移 Code-By.Org 群号 322023604
头像
523066680
版主
 
帖子: 1680
注册: 2012-03-06 15:08


回到 其他

在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客

Not able to open ./cache/data_global.php