2010-03-22 39 views
10

Ai đó có thể giúp tôi sử dụng chức năng gettimeofday() với Visual Studio C++ 2008 trên Windows XP? đây là mã mà tôi tìm thấy ở đâu đó trên mạng:làm thế nào để sử dụng gettimeofday() hoặc một cái gì đó tương đương với 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); 

Năm ngoái khi tôi thử nghiệm mã này với VC++ 6, nó hoạt động tốt. Nhưng bây giờ khi tôi sử dụng VC++ 2008, tôi nhận được lỗi xử lý ngoại lệ. Vì vậy, có bất kỳ ý tưởng về cách sử dụng gettimeofday hoặc một cái gì đó tương đương?

Cảm ơn câu trả lời của bạn và mọi trợ giúp sẽ được đánh giá cao:

+0

Bạn có thể đăng ngoại lệ bạn đang nhận được không? – Jason

+0

Vui lòng giải thích lỗi thực tế mà bạn đang nhận được - "lỗi xử lý ngoại lệ" không phải là rất cụ thể. –

+0

cảm ơn câu trả lời của bạn! tôi đã đăng một câu hỏi liên quan đến lỗi này và nó đang ở trên: http://stackoverflow.com/questions/2490449/how-to-solve-unhandled-exception-error-when-using-visual-c-2008 cảm ơn một lần nữa vì câu trả lời của bạn – make

Trả lời

2

Có một vài loại khác nhau để biểu thị thời gian. Dưới đây là một số mã tôi đã sử dụng thời gian gần đây:

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

sau đó tôi tiếp tục xây dựng một chuỗi từ mảnh local, nhưng bạn có thể làm những gì bạn muốn vào thời điểm này.

Kate

+0

Cảm ơn rất nhiều cho câu trả lời của bạn. Vâng! Tôi có thể sử dụng hàm time() nhưng nó không chính xác như hàm gettimeofday() và điều này làm cho tôi trở thành một vấn đề bởi vì tôi đang so sánh kết quả thu được trên Unix với những kết quả mà tôi có được trên Windows. cảm ơn một lần nữa! – make

18

Trong UNIX việc sử dụng cấu trúc múi giờ đã lỗi thời. Tôi không biết tại sao bạn sử dụng nó. Xem http://linux.about.com/od/commands/l/blcmdl2_gettime.htm Nhưng nếu bạn muốn sử dụng cấu trúc này để biết về sự khác biệt GMT (UTC) từ giờ địa phương của bạn, nó sẽ là tiếp theo: tz_minuteswest là sự khác biệt thực sự trong vài phút từ GMT (UTC) và tz_dsttime là một lá cờ cho biết liệu ánh sáng ban ngày có phải là bây giờ không đang sử dụng.

dụ của bạn với một số thay đổi hoạt động tốt trong 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

Điều này đã giúp tôi rất nhiều, nhưng tôi cần một thời gian chính xác hơn.Tôi đã sử dụng 'GetSystemTimePreciseAsFileTime' thay cho' GetSystemTimeAsFileTime', và nó hoạt động hoàn hảo. Chúc mừng. –

3

đồng hồ bấm giờ đơn giản chỉ trong vài giây

FWIW: Đây là một tương tự như của Kate, nhưng tôi chỉ muốn đề cập đến nó, nếu ai đó đang tìm kiếm đồng hồ bấm giờ đơn giản nhất trong C++ (tính giây). Không phải là một việc lớn, tôi biết. Nó chỉ có độ phân giải 1 giây, vì vậy nếu bạn muốn giới hạn các microsec, hãy tiếp tục với các ví dụ khác.

double seconds=0; 
time_t timer1, timer2; 
time(&timer1); /* get current time */ 
... 
time(&timer2); /* get current time later */ 
seconds = difftime(timer2,timer1); 
Các vấn đề liên quan