Vraag hoe gebruik je gettimeofday () of iets vergelijkbaars met Visual Studio C ++ 2008?


Kan iemand me alsjeblieft helpen om de functie gettimeofday () te gebruiken met Visual Studio C ++ 2008 op Windows XP? hier is een code die ik ergens op het net heb gevonden:

#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); 

Vorig jaar, toen ik deze code testte met VC ++ 6, werkte het prima. Maar nu, terwijl ik VC ++ 2008 gebruik, krijg ik een foutmelding over de afhandeling van uitzonderingen. Dus is er een idee over het gebruik van gettimeofday of iets gelijkwaardigs?

Bedankt voor uw antwoord en alle hulp wordt zeer op prijs gesteld:


10
2018-03-22 17:27


oorsprong


antwoorden:


In UNIX is het gebruik van de tijdzonestructuur verouderd. Ik weet niet waarom je het gebruikt. Zien http://linux.about.com/od/commands/l/blcmdl2_gettime.htm Maar als u deze structuur wilt gebruiken om te weten over GMT (UTC) diffrence van uw lokale tijd, is dit de volgende: tz_minuteswest is het echte verschil in minuten van GMT (UTC) en een tz_dsttime is een vlag die aangeeft of het daglicht nu in gebruik is .

Uw voorbeeld met enkele wijzigingen werkt prima in 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;
}

20
2018-03-04 18:38



Eenvoudige stopwatch in seconden

FWIW: Dit is een soortgelijke als die van Kate, maar ik wilde het alleen maar noemen, als iemand is op zoek naar de meest eenvoudige stopwatch in C ++ (tellen van seconden). Geen big deal, ik weet het. Het heeft alleen een resolutie van 1 sec, dus als je microseclen wilt opslaan, ga je verder met de andere voorbeelden.

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

3
2018-02-21 23:36



Er zijn een paar verschillende typen om een ​​tijd weer te geven. Hier is een code die ik onlangs heb gebruikt:

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

Ik ging toen door met het bouwen van een touwtje uit stukjes local, maar je zou kunnen doen wat je wilde op dit punt.

Kate


2
2018-03-22 19:01