11
votes

Comment utiliser GeyTimeOdday () ou quelque chose d'équivalent avec Visual Studio C ++ 2008?

Quelqu'un pourrait-il vous aider à utiliser GetTimeOdday () Fonction avec Visual Studio C ++ 2008 sur Windows XP? Voici un code que j'ai trouvé quelque part sur le net:

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


6 commentaires

Pouvez-vous poster l'exception que vous obtenez?


Veuillez expliquer l'erreur réelle que vous obtenez - "Erreur de manutention d'exception" n'est pas très spécifique.


merci pour vos réponses! J'ai déjà posté une question concernant cette erreur et il est sur: Stackoverflow.com/Questtions/2490449/... Merci encore pour vos réponses


S'il vous plaît ne postez pas la même question plusieurs fois. Dupliquer de Stackoverflow.com/Questtions/2490449/...


Désolé pour plusieurs messages. Comme j'ai besoin d'une aide pour résoudre ce problème, j'ai posté une question différente dans le délai d'essayer de le résoudre ... merci encore!


Remarque: Ce code manque des contrôles de nullité autour des arguments «TV» et «TZ» qui bloque probablement le programme de l'utilisateur au cas où ils envoient NULL dans l'un de ces arguments. Consultez la citation suivante de Man GettimeOdDay: "Si la téléviseur ou TZ est NULL, la structure correspondante n'est pas réglée ou retournée. L'utilisation de la structure de fuseau horaire est obsolète; l'argument TZ devrait normalement être spécifié comme null."


4 Réponses :


3
votes

Il y a quelques types différents pour représenter un temps. Voici un certain code que j'ai utilisé récemment:

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


1 commentaires

Merci beaucoup pour votre réponse. Oui! Je pourrais utiliser la fonction Time () mais ce n'est pas aussi précis que GettimeOdday () et cela fait de moi un problème parce que je suis attaché à comparer les résultats que j'ai obtenus sur Unix avec ceux que je vais obtenir sous Windows. Merci encore!



21
votes

in Unix L'utilisation de la structure TimeZone est obsolète. Je ne sais pas pourquoi tu l'utilises. Voir http://linux.about.com/od/commands/l/blcmdl2_gettime. HTM mais si vous souhaitez utiliser cette structure pour connaître la diffrence GMT (UTC) à partir de votre heure locale, il sera suivant: TZ_MINUtesWest est la diffrence réelle en quelques minutes à partir de GMT (UTC) et d'un drapeau indique si La lumière du jour est maintenant utilisée.

Votre exemple avec certaines modifications fonctionne bien dans Visual C ++ 2008 Express: P>

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


1 commentaires

Cela m'a aidé beaucoup, mais j'avais besoin d'un moment plus précis. J'ai utilisé getSystemTimePeceSeSfileTime à la place de getSystemTimeasFileTime , et ça a fonctionné parfaitement. À votre santé.



5
votes

Simple chronomètre en secondes strong>

fwiw: C'est un tel que celui de Kate, mais je voulais juste la mentionner, si em> Strong> Quelqu'un cherche le chronomètre le plus simple en C ++ (comptage des secondes). Pas une grosse affaire, je sais. Il n'a que la résolution de 1 seconde, donc si vous souhaitez cuiller des microsecs, continuez avec les autres exemples. P>

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


0 commentaires

1
votes

Dans mon cas, cela fonctionnait comme suit: Depuis que je voulais trouver la durée de fonctionnement moyenne, j'ai utilisé: Inclure d'abord au début du programme, puis: Initialiser des échantillons = 100 (par exemple);

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


0 commentaires