【问题标题】:how to use gettimeofday() or something equivalent with Visual Studio C++ 2008?如何使用 gettimeofday() 或与 Visual Studio C++ 2008 等效的东西?
【发布时间】:2011-01-30 11:07:03
【问题描述】:

有人可以帮我在 Windows XP 上使用带有 Visual Studio C++ 2008 的 gettimeofday() 函数吗?这是我在网上某处找到的代码:

#include < time.h >
#include <windows.h> 

#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
  #define DELTA_EPOCH_IN_MICROSECS  11644473600000000Ui64
#else
  #define DELTA_EPOCH_IN_MICROSECS  11644473600000000ULL
#endif

struct timezone 
{
  int  tz_minuteswest; /* minutes W of Greenwich */
  int  tz_dsttime;     /* type of dst correction */
};

int gettimeofday(struct timeval *tv, struct timezone *tz)
{
  FILETIME ft;
  unsigned __int64 tmpres = 0;
  static int tzflag;

  if (NULL != tv)
  {
    GetSystemTimeAsFileTime(&ft);

    tmpres |= ft.dwHighDateTime;
    tmpres <<= 32;
    tmpres |= ft.dwLowDateTime;

    /*converting file time to unix epoch*/
    tmpres -= DELTA_EPOCH_IN_MICROSECS; 
    tmpres /= 10;  /*convert into microseconds*/
    tv->tv_sec = (long)(tmpres / 1000000UL);
    tv->tv_usec = (long)(tmpres % 1000000UL);
  }

  if (NULL != tz)
  {
    if (!tzflag)
    {
      _tzset();
      tzflag++;
    }
    tz->tz_minuteswest = _timezone / 60;
    tz->tz_dsttime = _daylight;
  }

  return 0;
}

...
// call gettimeofday()
 gettimeofday(&tv, &tz); 
 tm = localtime(&tv.tv_sec); 

去年我用 VC++6 测试这段代码时,它运行良好。但是现在当我使用 VC++ 2008 时,我遇到了异常处理的错误。那么对于如何使用 gettimeofday 或类似的东西有什么想法吗?

感谢您的回复,我们将不胜感激:

【问题讨论】:

  • 你能发布你得到的异常吗?
  • 请解释您遇到的实际错误——“异常处理错误”不是很具体。
  • 感谢您的回复!我已经发布了一个关于这个错误的问题,它在:stackoverflow.com/questions/2490449/… 再次感谢您的回复
  • 请不要多次发布同一个问题。与stackoverflow.com/questions/2490449/… 重复
  • 抱歉有多个帖子。由于我需要帮助来解决这个问题,我在试图解决它的时间内发布了不同的问题......再次感谢!

标签: c visual-studio visual-studio-2008 visual-c++ gettimeofday


【解决方案1】:

在 UNIX 中,时区结构的使用已过时。我不知道你为什么用它。请参阅http://linux.about.com/od/commands/l/blcmdl2_gettime.htm 但如果您想使用此结构来了解 GMT(UTC) 与本地时间的差异,它将是下一个:tz_minuteswest 是与 GMT(UTC) 的真正差异(以分钟为单位),而 tz_dsttime 是指示是否是日光的​​标志正在使用中。

您的示例在 Visual C++ 2008 Express 中进行了一些更改:

#include "stdafx.h"
#include <time.h>
#include <windows.h> 

const __int64 DELTA_EPOCH_IN_MICROSECS= 11644473600000000;

/* IN UNIX the use of the timezone struct is obsolete;
 I don't know why you use it. See http://linux.about.com/od/commands/l/blcmdl2_gettime.htm
 But if you want to use this structure to know about GMT(UTC) diffrence from your local time
 it will be next: tz_minuteswest is the real diffrence in minutes from GMT(UTC) and a tz_dsttime is a flag
 indicates whether daylight is now in use
*/
struct timezone2 
{
  __int32  tz_minuteswest; /* minutes W of Greenwich */
  bool  tz_dsttime;     /* type of dst correction */
};

struct timeval2 {
__int32    tv_sec;         /* seconds */
__int32    tv_usec;        /* microseconds */
};

int gettimeofday(struct timeval2 *tv/*in*/, struct timezone2 *tz/*in*/)
{
  FILETIME ft;
  __int64 tmpres = 0;
  TIME_ZONE_INFORMATION tz_winapi;
  int rez=0;

   ZeroMemory(&ft,sizeof(ft));
   ZeroMemory(&tz_winapi,sizeof(tz_winapi));

    GetSystemTimeAsFileTime(&ft);

    tmpres = ft.dwHighDateTime;
    tmpres <<= 32;
    tmpres |= ft.dwLowDateTime;

    /*converting file time to unix epoch*/
    tmpres /= 10;  /*convert into microseconds*/
    tmpres -= DELTA_EPOCH_IN_MICROSECS; 
    tv->tv_sec = (__int32)(tmpres*0.000001);
    tv->tv_usec =(tmpres%1000000);


    //_tzset(),don't work properly, so we use GetTimeZoneInformation
    rez=GetTimeZoneInformation(&tz_winapi);
    tz->tz_dsttime=(rez==2)?true:false;
    tz->tz_minuteswest = tz_winapi.Bias + ((rez==2)?tz_winapi.DaylightBias:0);

  return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{
struct timeval2 tv;
struct timezone2 tz;
struct tm *tm1; 
time_t time1;

ZeroMemory(&tv,sizeof(tv));
ZeroMemory(&tz,sizeof(tz));

gettimeofday(&tv, &tz); // call gettimeofday()
time1=tv.tv_sec;
tm1 = localtime(&time1); 



 FILE *f;
 f=fopen("rez.txt","w");

 fprintf(f,"%04d.%02d.%02d %02d:%02d:%02d\n",1900+tm1->tm_year,1+tm1->tm_mon,tm1->tm_mday,tm1->tm_hour,tm1->tm_min,tm1->tm_sec);
 fprintf(f,"Diffrence between GMT(UTC) and local time=%d %s\n",tz.tz_minuteswest,"minutes");
 fprintf(f,"Is Daylight now=%s\n",tz.tz_dsttime?"Yes":"No");

 fclose(f);
 return 0;
}

【讨论】:

  • 这对我帮助很大,但我需要更精确的时间。我用GetSystemTimePreciseAsFileTime 代替GetSystemTimeAsFileTime,效果很好。干杯。
【解决方案2】:

秒表秒表

FWIW:这个和 Kate 的类似,但我只想提一下,如果有人在寻找 C++ 中最简单的秒表(计数秒)。 没什么大不了的,我知道。它只有 1 秒的分辨率,所以如果你想计算微秒,请继续其他示例。

double seconds=0;
time_t timer1, timer2;
time(&timer1);  /* get current time  */
...
time(&timer2);  /* get current time  later */
seconds = difftime(timer2,timer1);

【讨论】:

    【解决方案3】:

    有几种不同的类型来表示时间。这是我最近使用的一些代码:

    time_t now;
    time(&now); 
    tm* local = localtime(&now);
    

    然后我继续从 local 的片段构建一个字符串,但此时你可以做你想做的事。

    【讨论】:

    • 非常感谢您的回复。是的!我可以使用 time() 函数,但它不如 gettimeofday() 函数精确,这给我带来了问题,因为我想将在 Unix 上获得的结果与在 Windows 上获得的结果进行比较。再次感谢!
    【解决方案4】:

    就我而言,它的工作原理如下: 因为我想找到平均运行时间,所以我使用了: 首先包括在程序的开头,然后: 初始化样本=100(例如);

    time_t t_start,t_end;
    time(&t_start); //get the current time
    
    //program that needs to be timed
    
    time(&t_end); //get the time at the end of execution of the program
    seconds = (difftime(t_start,t_end))/samples;//calculate the difference
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 2011-08-01
      • 2017-05-02
      • 1970-01-01
      相关资源
      最近更新 更多