2010-05-18 4 views
1

C에서 UTC 타임 스탬프가있는 버퍼가 있으며, 10 초마다 해당 버퍼가 브로드 캐스팅됩니다. 문제는 두 패킷 간의 시간차가 일관성이 없다는 것입니다. 5 회에서 10 회까지 반복하면 시차는 9, 11 그리고 10이됩니다.이 문제를 해결하는 데 도움이됩니다.Windows의 UTC 타임 스탬프

나는 <time.h>을 UTC 시간으로 사용하고 있습니다.

+0

무엇이 문제인지 잘 모르겠습니다. 10 초 동안 자고 있습니까? 시간을 검색하면 그 차이가 항상 10 초가되는 것은 아닙니다. – Artefacto

+0

예 내 스레드가 10 초 후에 다시 UTC 시간을 가져 와서 보냅니다. – Siddiqui

답변

1

X 밀리 초 동안 대기하는 스레드는 정확히 수 밀리 초 동안 잠자기 상태가 보장되지 않습니다.

while(1) { 
    ... 
    sleep(10); // Sleep for 10 seconds. 
    // fetch timestamp and send 
} 

당신이 시간이 만료 될 때까지 검사하는 루프에서 짧은 기간 (예를 들어 20 밀리 초) 동안 잠 경우 시간이 더 정확한 게이지를 얻을 것이다 : 나는 당신이 뭔가를가는 문이 있다고 가정하고있다. 10 초 동안 잠을 자면 스레드가 기본 OS의 즉각적인 스케줄링 우선 순위에서 더 멀리 이동합니다.

타임 스탬프를 보내는 데 걸리는 시간은 네트워크 상태 등에 따라 달라질 수 있습니다. sleep (10) -> send -> sleep (10) 루프 유형, 보내는 데 걸리는 시간이 다음 번 sleep (10)에 실제 시간으로 추가됩니다. 당신은 표준 C 라이브러리를 사용하는 방법에 대한 방해하지 않는 경우

bool expired = false; 
double last, current; 
double t1, t2; 
double difference = 0; 

while(1) { 
    ... 
    last = (double)clock(); 
    while(!expired) { 
     usleep(200); // sleep for 20 milliseconds 
     current = (double)clock(); 
     if(((current - last)/(double)CLOCKS_PER_SEC) >= (10.0 - difference)) 
     expired = true; 
    } 
    t1 = (double)clock(); 
    // Set and send the timestamp. 
    t2 = (double)clock(); 
    // 
    // Calculate how long it took to send the stamps. 
    // and take that away from the next sleep cycle. 
    // 
    difference = (t2 - t1)/(double)CLOCKS_PER_SEC; 
    expired = false; 
} 

하면, 당신은 고해상도 타이머 기능을 사용하여 볼 수 있었다 :

이 같은 (용서, 내 C는 약간 녹슨입니다)를보십시오 QueryPerformanceFrequency/QueryPerformanceCounter 함수와 같은 창.

LONG_INTEGER freq; 
LONG_INTEGER t2, t1; 
// 
// Get the resolution of the timer. 
// 
QueryPerformanceFrequency(&freq); 

// Start Task. 
QueryPerformanceCounter(&t1); 

... Do something .... 

QueryPerformanceCounter(&t2); 

// Very accurate duration in seconds. 
double duration = (double)(t2.QuadPart - t1.QuadPart)/(double)freq.QuadPart; 
+1

P. 해상도가 1 초이므로 difftime보다 더 정확한 것을 사용하고자 할 수 있습니다. CLK_PER_SECOND 상수가있는 clock()이 있습니다. –

+0

CLOCK_PER_SECOND은 (는) 창에 사용할 수 있습니까? – Siddiqui

+1

예, 표준 라이브러리의 일부입니다. CLOCKS_PER_SEC. 더 정확한 시간을 얻으려면 double t = (dobule) clock()/(double) CLOCKS_PER_SEC; –

3

타임 스탬프의 해상도가 1 초인 경우 최소 유효 자릿수에 항상 +/- 1 불확실성이 있습니다 (이 경우 +/- 1 초).

설명 : 해상도가 1 초인 경우 시간 값은 quantized입니다. 이러한 양자화 된 값으로 표현 된 실시간은 t이고 범위는 t..t+0.9999입니다. 이러한 두 시간의 차이를 t0t1으로하면 t1-t0의 최대 오류는 -0.999..+0.999이며, 양자화시 +/-1 초입니다. 따라서 귀하의 경우에는 초 사이의 차이 값을 볼 것으로 예상됩니다.

+0

1 초 해상도 란 무엇을 의미합니까? 어떻게이 문제를 해결할 수 있을까요? – Siddiqui

+0

@Arman : 자세한 설명은 위를 참조하십시오. –