C# DateTime.Now 함수 특정 컴퓨터에서 발생하는 오류에 관한 질문

안녕하세요

현재 C#을 활용하여 각각의 센서 데이터를 시간대별로 로깅하는 프로그램을 제작하고있습니다.

로깅할때의 시간은 C#의 DateTime.Now함수를 활용하고 있는데, 알수 없는 문제가 발생하여 질문 드립니다.

데스크탑을 사용할 수 없는 환경에서의 데이터 로깅을 하고있기때문에 노트북을 사용하여 프로그램을 실행시키고있는데

몇몇 노트북을 사용하여 프로그램을 구동할 때에 같은 시간이 반복하여 로깅되는 현상을 발견하였습니다.

데이터는 100Hz의 주기로 로깅을 하고있고 로깅된 파일을 확인해보면 센서데이터는 문제가없으나, 소수점 3자리의 밀리초가 반복되어 시간이 로깅되는 현상이 몇몇 노트북에서 발생하고있습니다.

window환경의 시계서버도 변경해보고 이것저것 만져보고있으나 시간이 중복되어 로깅되는 문제가 고쳐지지않습니다.

윈도우 버젼의 문제도 아니고, 노트북 성능의 문제도 아닌것을 확인하였으나 문제를 해결하고 싶습니다.
문제가 발생하는 상황은 아래 이미지와 같습니다.

글쎄요. DateTime.Now의 문제가 아닌 것 같습니다. 정상적으로 출력할 때 대략 16ms 간격으로 기록되는것 같은데 중복된 이후의 밀리초도 대략 16ms 인것으로 보아 혹시 Thread.Sleep등으로 딜레이를 주시나요? 다른 문제인 것 같습니다.

1개의 좋아요

100hz라면 초당 100번씩인데, 그렇다면 10ms 당 호출하는 상황에서 스레드 스케줄링이 16ms마다 발생하는 환경이므로 정상 동작하는 것이 맞습니다. 다음의 글을 읽어보시면 16ms를 1ms로 바꾸는 방법이 나오는데, 그렇게 해주시면 문제가 해결될 것입니다.

Windows: 120. 윈도우 운영체제의 시간 함수 (1) - GetTickCount와 timeGetTime의 차이점 (sysnet.pe.kr)

.NET Framework: 614. C# - DateTime.Ticks의 정밀도 (sysnet.pe.kr)

4개의 좋아요

딜레이 함수는 사용하지 않고있습니다.
또한 이해가 안가는 점이 어떤 노트북에서는 정상적으로 작동을 하고 어떤 노트북에서는 저런 문제점이 생기는 것입니다.

답변 감사합니다만 구축한 시스템에서 타이머 인터럽트는 사용하지 않고있습니다.
데이터 Recv인터럽트를 사용하여 데이터를 받고 로깅하고있습니다.

다른 질문으로는 어떤 노트북에서는 프로그램이 정상적으로 작동을 하고 어떤 노트북에서는 프로그램이 저런식으로 작동합니다만 CPU나 GPU의 성능과는 연관관계가 없는것 같습니다.

성능이 낮은 노트북에서 정상작동하는 경우도 있고 성능이 높은 노트북에서는 정상작동하지 않는 경우도 있는것 같습니다.

케빈님이 이전에 작성하신 링크를 살펴보시면 답이 있습니다.

테스트 환경이 아닌 환경에서 테스트해보긴 하였지만 timeBeginPeriod와 timeEndPeriod가 생각보다 유효한 효과를 낸것 같습니다.
실제 필드에서 테스트 해보고 결과 말씀 드리겠습니다.

문제는 해결되었지만 일부 노트북에서는 작동을 하지 않고 일부 노트북에서는 작동을 잘 한 것은 어떤 요인때문에 그런걸까요?? 혹시 Visual installer에서 SQL server항목을 다운받고 안받고의 차이가 그러한 상황을 만들어 낼 수 있는 것인가요??

감사합니다 링크를 보고 코드 작성을 다시 해본 결과 생각보다 유효한 결과가 나왔습니다.

1개의 좋아요

일부 노트북에서 되고, 안 되고의 의문도 첫 번째 링크 글에 답이 있는데요, 왠지 질문자가 문제 해결만을 위해 최소한의 내용만 읽어본 듯하군요.

만약 제대로 그 글을 정독하셨다면 “구축한 시스템에서 타이머 인터럽트를 사용하지 않고…” 라는 식의 의심은 하지 않을 것입니다. (제가 그 글에서 검증하기 위해 사용한 코드도 타이머 인터럽트를 직접적으로 사용하고 있지 않습니다.) 다시 한번 차근차근히 그 글을 읽어보시고 그래도 정 모르겠다면 다시 질문을 해주세요.

죄송합니다. 말씀해주신 것처럼 제가 링크를 대충읽고 넘긴것 같네요…

보내주신 링크 다시한번 정독하였고, 말씀하신것을 다시 한번 확인해보는 차원에서 질문을 드리자면

오히려 백그라운드에 특정 프로그램 (ex 구글 크롬, snagit 등)이 실행되어있는 환경의 플랫폼에서 오히려 저런 문제점이 발생하지않는다고 이해를 하고있으면 될까요…??

귀찮으심에도 불구하고 계속 답변 달아주시는 답변자 분께 정말 감사드립니다.

1개의 좋아요

비슷합니다.

그러니까, 여기서 문제의 원인은 (clockres.exe로 확인할 수 있는) 타이머 인터럽트가 1ms로 설정된 노트북 등의 PC에서는 원하는 답이 나왔을 것입니다. 반면 (기본값 그대로 설정된) 15.625ms로 맞춰져 있는 PC에서는 질문하신 그런 현상이 나온 것입니다.

일부 노트북들이 1ms로 동작하고 있는 것은 그렇게 설정을 바꾼 일부 프로그램들이 실행 중이기 때문입니다.

1개의 좋아요

감사합니다. 정말 많은 도움이 되었습니다.

1개의 좋아요