C에서 UTC 타임 스탬프가있는 버퍼가 있으며, 10 초마다 해당 버퍼가 브로드 캐스팅됩니다. 문제는 두 패킷 간의 시간차가 일관성이 없다는 것입니다. 5 회에서 10 회까지 반복하면 시차는 9, 11 그리고 10이됩니다.이 문제를 해결하는 데 도움이됩니다.Windows의 UTC 타임 스탬프
나는 <time.h>
을 UTC 시간으로 사용하고 있습니다.
C에서 UTC 타임 스탬프가있는 버퍼가 있으며, 10 초마다 해당 버퍼가 브로드 캐스팅됩니다. 문제는 두 패킷 간의 시간차가 일관성이 없다는 것입니다. 5 회에서 10 회까지 반복하면 시차는 9, 11 그리고 10이됩니다.이 문제를 해결하는 데 도움이됩니다.Windows의 UTC 타임 스탬프
나는 <time.h>
을 UTC 시간으로 사용하고 있습니다.
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;
P. 해상도가 1 초이므로 difftime보다 더 정확한 것을 사용하고자 할 수 있습니다. CLK_PER_SECOND 상수가있는 clock()이 있습니다. –
CLOCK_PER_SECOND은 (는) 창에 사용할 수 있습니까? – Siddiqui
예, 표준 라이브러리의 일부입니다. CLOCKS_PER_SEC. 더 정확한 시간을 얻으려면 double t = (dobule) clock()/(double) CLOCKS_PER_SEC; –
타임 스탬프의 해상도가 1 초인 경우 최소 유효 자릿수에 항상 +/- 1 불확실성이 있습니다 (이 경우 +/- 1 초).
설명 : 해상도가 1 초인 경우 시간 값은 quantized
입니다. 이러한 양자화 된 값으로 표현 된 실시간은 t
이고 범위는 t..t+0.9999
입니다. 이러한 두 시간의 차이를 t0
및 t1
으로하면 t1-t0
의 최대 오류는 -0.999..+0.999
이며, 양자화시 +/-1
초입니다. 따라서 귀하의 경우에는 초 사이의 차이 값을 볼 것으로 예상됩니다.
1 초 해상도 란 무엇을 의미합니까? 어떻게이 문제를 해결할 수 있을까요? – Siddiqui
@Arman : 자세한 설명은 위를 참조하십시오. –
무엇이 문제인지 잘 모르겠습니다. 10 초 동안 자고 있습니까? 시간을 검색하면 그 차이가 항상 10 초가되는 것은 아닙니다. – Artefacto
예 내 스레드가 10 초 후에 다시 UTC 시간을 가져 와서 보냅니다. – Siddiqui