2010-03-22 9 views
10

Qualcuno potrebbe aiutarmi a utilizzare la funzione gettimeofday() con Visual Studio C++ 2008 su Windows XP? qui è un codice che ho trovato da qualche parte in rete:come utilizzare gettimeofday() o qualcosa di equivalente con 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'anno scorso quando ho provato questo codice con VC++ 6, ha funzionato bene. Ma ora, mentre utilizzo VC++ 2008, ricevo errori di gestione delle eccezioni. Quindi c'è qualche idea su come usare gettimeofday o qualcosa di equivalente?

Grazie per la risposta e qualsiasi aiuto sarebbe molto apprezzato:

+0

Puoi pubblicare l'eccezione che stai ricevendo? – Jason

+0

Si prega di spiegare l'errore reale che si sta ottenendo - "errore di gestione delle eccezioni" non è molto specifico. –

+0

grazie per le vostre risposte! ho già postato una domanda riguardante questo errore ed è su: http://stackoverflow.com/questions/2490449/how-to-solve-unhandled-exception-error-when-using-visual-c-2008 grazie ancora per le vostre risposte – make

risposta

2

Ci sono alcuni tipi differenti per rappresentare un momento. Ecco alcuni codice che ho usato di recente:

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

Ho poi continuato a costruire una stringa da pezzi di local, ma si poteva fare quello che voleva, a questo punto.

Kate

+0

Grazie a molto per la tua risposta. Sì! Potrei usare la funzione time() ma non è precisa come la funzione gettimeofday() e questo mi rende un problema perché mi sto legando per confrontare i risultati ottenuti su Unix con quelli che otterrò su Windows. grazie ancora! – make

18

In UNIX l'uso della struct fuso orario è obsoleto. Non so perché lo usi. Vedi http://linux.about.com/od/commands/l/blcmdl2_gettime.htm Ma se vuoi usare questa struttura per conoscere la diffrenza GMT (UTC) dall'ora locale sarà la prossima: tz_minuteswest è la vera diffrazione in minuti da GMT (UTC) e un tz_dsttime è una bandiera indica se la luce del giorno è ora in uso.

Il vostro esempio con alcune modifiche funziona bene 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; 
} 
+0

Questo mi ha aiutato molto, ma avevo bisogno di un tempo più preciso.Ho usato 'GetSystemTimePreciseAsFileTime' al posto di' GetSystemTimeAsFileTime', e ha funzionato perfettamente. Saluti. –

3

cronometro semplice in pochi secondi

FWIW: Questo è uno simile a quello di Kate, ma volevo solo per dirlo, se qualcuno sta cercando il cronometro più semplice in C++ (contando secondi). Non è un grosso problema, lo so. Ha solo una risoluzione di 1 sec, quindi se vuoi cound microsec, continua con gli altri esempi.

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