C 以毫秒为精度的时间戳

C 以毫秒为精度的时间戳,c,windows,datetime,time.h,C,Windows,Datetime,Time.h,我对C编程比较陌生,我正在做一个需要非常精确的时间的项目;因此,我试图写一些东西来创建毫秒精度的时间戳 这似乎有效,但我的问题是,这是正确的方法,还是有更简单的方法?这是我的密码: #include<stdio.h> #include<time.h> void wait(int milliseconds) { clock_t start = clock(); while(1) if(clock() - start >= milliseconds)

我对C编程比较陌生,我正在做一个需要非常精确的时间的项目;因此,我试图写一些东西来创建毫秒精度的时间戳

这似乎有效,但我的问题是,这是正确的方法,还是有更简单的方法?这是我的密码:

#include<stdio.h>
#include<time.h>

void wait(int milliseconds)
{
    clock_t start = clock();
    while(1) if(clock() - start >= milliseconds) break;
}

int main()
{
    time_t now;
    clock_t milli;
    int waitMillSec = 2800, seconds, milliseconds = 0;
    struct tm * ptm;

    now = time(NULL);
    ptm = gmtime ( &now );
    printf("time before: %d:%d:%d:%d\n",ptm->tm_hour,ptm->tm_min,ptm->tm_sec, milliseconds );

    /* wait until next full second */
    while(now == time(NULL));

    milli = clock();
    /* DO SOMETHING HERE */
    /* for testing wait a user define period */
    wait(waitMillSec);
    milli = clock() - milli;

    /*create timestamp with milliseconds precision */
    seconds = milli/CLOCKS_PER_SEC;
    milliseconds = milli%CLOCKS_PER_SEC;
    now = now + seconds;
    ptm = gmtime( &now );
    printf("time after: %d:%d:%d:%d\n",ptm->tm_hour,ptm->tm_min,ptm->tm_sec, milliseconds );
    return 0;
}
#包括
#包括
无效等待(整数毫秒)
{
时钟启动=时钟();
而(1)如果(时钟()-开始>=毫秒)中断;
}
int main()
{
现在是时候了;
时钟毫安;
int waitMillSec=2800,秒,毫秒=0;
struct tm*ptm;
现在=时间(空);
ptm=gmtime(&now);
printf(“之前的时间:%d:%d:%d:%d\n”,ptm->tm_小时,ptm->tm_分钟,ptm->tm_秒,毫秒);
/*等到下一整秒*/
while(now==时间(NULL));
毫=时钟();
/*在这里做点什么*/
/*对于测试,请等待用户定义的时间段*/
等待(等待秒);
毫秒=时钟()-毫秒;
/*创建毫秒精度的时间戳*/
秒=毫秒/时钟/秒;
毫秒=毫秒每秒时钟数百分比;
现在=现在+秒;
ptm=gmtime(&now);
printf(“之后的时间:%d:%d:%d:%d\n”,ptm->tm_小时,ptm->tm_分钟,ptm->tm_秒,毫秒);
返回0;
}

时钟周期根本不能保证以毫秒为单位。您需要将clock()的输出显式转换为毫秒

t1 = clock();
// do something
t2 = clock();
long millis = (t2 - t1) * (1000.0 / CLOCKS_PER_SEC);

既然您使用的是Windows,为什么不直接使用?

以下代码似乎可以提供毫秒级的粒度:

#include <windows.h>
#include <stdio.h>

int main(void) {
    SYSTEMTIME t;
    GetSystemTime(&t); // or GetLocalTime(&t)
    printf("The system time is: %02d:%02d:%02d.%03d\n", 
        t.wHour, t.wMinute, t.wSecond, t.wMilliseconds);
    return 0;
}
#包括
#包括
内部主(空){
系统时间t;
GetSystemTime(&t);//或GetLocalTime(&t)
printf(“系统时间为:%02d:%02d:%02d.%03d\n”,
t、 呼,t.w分钟,t.w秒,t.w毫秒);
返回0;
}
这是基于。上面的代码片段是在Windows7上用CYGWIN测试的


对于Windows 8,有,它“以尽可能高的精度检索当前系统日期和时间(非常感谢您的快速响应。当我回到我的工作机器上时,我会试试这个。直到现在我还不敢使用任何windows标题。不幸的是,我必须使用windows xp和Visual Studio 6.0,希望这不会成为问题。@morten:msdn链接说
GetSystemTime
在windows 2000及更高版本上可用,我只有veri确认它似乎在我的XP家用SP3机器上工作。祝你好运,并告诉我们你最终做了什么。只是想说声谢谢,我刚刚实现了你的想法,一切都很好。遗憾的是,我不知道它。正如我所说,我对c编程相当陌生,我花了很长时间才想出一个等待函数:)@morten-Busy循环不必要地消耗大量CPU。Non-zero Sleep()将当前进程的时间片返回内核,以便它可以安排另一个进程运行。