2010-03-22 3 views
10

Quelqu'un pourrait m'aider s'il vous plaît à utiliser la fonction gettimeofday() avec Visual Studio C++ 2008 sur Windows XP? voici un code que j'ai trouvé quelque part sur le net:comment utiliser gettimeofday() ou quelque chose d'équivalent avec Visual Studio C++ 2008?

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

L'an dernier, lorsque je l'ai testé ce code avec VC++ 6, il a bien fonctionné. Mais maintenant que j'utilise VC++ 2008, j'obtiens une erreur de gestion des exceptions. Alors, y a-t-il une idée sur la façon d'utiliser gettimeofday ou quelque chose d'équivalent?

Merci pour votre réponse et toute aide serait très apprécié:

+0

Pouvez-vous publier l'exception que vous obtenez? – Jason

+0

Veuillez expliquer l'erreur réelle que vous obtenez - "erreur de gestion des exceptions" n'est pas très spécifique. –

+0

merci pour vos réponses! J'ai déjà posté une question concernant cette erreur et il est sur: http://stackoverflow.com/questions/2490449/how-to-solve-unhandled-exception-error-when-using-visual-c-2008 merci encore pour vos réponses – make

Répondre

2

Il y a quelques types différents pour représenter un temps. Voici un code je récemment:

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

Je suis ensuite allé à construire une chaîne à partir de morceaux de local, mais vous pouvez faire ce que vous vouliez à ce stade.

Kate

+0

Merci beaucoup pour votre réponse. Oui! Je pourrais utiliser la fonction time() mais ce n'est pas aussi précis que la fonction gettimeofday() et cela me pose un problème car je suis en train de comparer les résultats obtenus sous Unix avec ceux que j'obtiendrais sous Windows. Merci encore! – make

18

Dans UNIX l'utilisation du struct fuseau horaire 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 voulez utiliser cette structure pour connaître GMT (UTC) diffrence de votre heure locale ce sera la prochaine: tz_minuteswest est la vraie différence en minutes de GMT (UTC) et un tz_dsttime est un drapeau qui indique si la lumière du jour est maintenant utilisé.

Votre exemple avec quelques modifications fonctionne très bien dans 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; 
} 
+0

Cela m'a beaucoup aidé, mais j'avais besoin d'un temps plus précis.J'ai utilisé 'GetSystemTimePreciseAsFileTime' à la place de' GetSystemTimeAsFileTime', et cela a fonctionné parfaitement. À votre santé. –

3

chronomètre simple en quelques secondes

FWIW: C'est semblable à celle de Kate, mais je voulais juste pour le mentionner, si quelqu'un cherche le chronomètre le plus simple en C++ (en comptant les secondes). Pas grave, je sais. Il a seulement une résolution de 1 sec, donc si vous voulez cound microsecs, continuez avec les autres exemples.

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