문제

다른 컴퓨터에서 이벤트를 독립적으로 녹음하고 이벤트가 서로 관련하여 발생한 이벤트를 주문해야합니다. 솔루션은 각 컴퓨터가 비교적 독립적이어야합니다. 그들은 서로 직접 또는 단일 소스와 직접 대화 할 수 없습니다.

초기 솔루션은 각 기계에서 시간을 기록했지만 시간이 다를 수 있기 때문에 하루 종일 변경 될 수 있으므로 내 문제를 완전히 해결하지 못했습니다. 기계가 (1) 프로세스를 시작하거나 (2) 시스템 시계가 변경 될 때마다 모든 기계와 공유하기로 결정했습니다.

그래서 각 컴퓨터에서 나는 이것들로 가득 찬 로그를 얻는다

public class Activity {
    DateTime TimeOccurred { get; set; }
    string Description { get; set; }
}

(1) 또는 (2)가 위에서 발생할 때마다 로그에 활동을 추가하고 다른 기계에 브로드 캐스트하는데,이 기계는 로그에 동일한 활동을 추가하고 번역 된 시간은 자신의 시간입니다.

public class TimeSynchronization : Activity {
    string SourceMachine { get; set; }
    DateTime TranslatedTime { get; set; }
}

따라서 기계 A는 (순서대로)를 가질 것입니다.

TimeSynchronization "started" at 3:00 am.
Activity "asked a question" at 3:05 am.
TimeSynchronization from machine B at 3:05 am.
TimeSynchronization "clock changed" at 3:03 am.
Activity "received an answer" at 3:04 am.

기계 B는 다음과 같습니다.

TimeSynchronization "started" at 3:05 am.
TimeSynchronization "clock changed" at 3:06

따라서 위의 이벤트의 동일한 순서와 타이밍을 다음과 같은 것들로 재구성해야합니다.

On machine A: TimeSynchronization "started" at 0:00
On machine A: Activity "asked a question" at 0:05
On machine B: TimeSynchronization "started" at 0:05
On machine A: TimeSychronization from machine B at 0:05
On machine A: TimeSynchronization "clock changed" at 0:06
On machine B: TimeSynchronization "clock changed" at 0:06
On machine A: Activity "received an answer" at 0:07

가장 좋은 방법은 무엇입니까? List<Activity> 각 컴퓨터에서 이벤트와 순서대로 하나의 목록으로 병합합니까?

도움이 되었습니까?

해결책

두 컴퓨터가 네트워크를 통해 연결된 경우 귀하의 프로그램은 다른 기계에 몇 시간이 있는지 물어볼 수 있습니다. 이렇게하면 기계 A의 프로그램이 A와 B 모두에서 시간을 요청한 다음 두 번 기록 할 수 있습니다.

당신은 시간이 낮에 바뀔 수 있다고 언급합니다 (아마도 사용자는 시간이 바뀌었을 것입니다). Win32. TimeChanged 이벤트를 사용하여이를 감지 할 수 있습니다.

다른 팁

원자 시간과 당신에게 줄 웹 서비스. 그것이 당신이 필요로하는 것입니다. 현실적입니까? 몰라요. 그러나 적어도 N 컴퓨터가 시계를 동기화하려는 걱정할 필요는 없습니다.

그들은 당신이 당신이 직관하기를 원하는 것처럼 보입니다 분산 거래

또한 확인하십시오 네트워크 시간 프로토콜:

NTP는 네트워크를 통해 컴퓨터의 시계를 동기화하도록 설계된 프로토콜입니다.

UTC (Universal Time)에서 모든 것을 기록하고 싶다고 생각합니다. 이것은 일반적인 시점과 관련하여 시간과 함께 시간을 기록 할 수 있으며 날짜/시간을 매우 쉽게 비교할 수 있습니다. 현지 시간에 표시하려면 오프셋을 식별하고 UTC 시간과 로컬로의 차이를 계산합니다. 예를 들어 동해안에서 UTC -5, UTC 시간이 17:00 인 경우 뉴욕의 현지 시간은 12:00이고 달라스에서 UTC -6이므로 오전 11시입니다.

달라스에서 오전 11시 10 분에 행사가 있다면 UTC 시간은 17:10이고 뉴욕에서 오후 12시 5 분에 이벤트는 17:05 UTC입니다. 뉴욕 이벤트가 먼저 발생했음을 알지만 당신은 시간이 그렇게 보이지 않는 시간을 비교했습니다.

UTC는 또한 하루의 모든 24 시간을 대표한다는 이점이 있으므로, 가을에는 하루가 지나면 2시 ~ 3am 이벤트의 2 세트를 얻지 못하고 앞으로 나아갈 때 시간을 잃지 않습니다. Dalylight 절약 시간에.

우선 : 각 기계의 작업이 진정으로 평행 한 경우 단일 표준 직렬화 순서가 있음을 보장 할 수 없습니다. 전체 프로세스에 약간의 조정이있는 경우 프로토콜에서 일종의 시퀀싱을 사용하는 것이 좋습니다.

그 외에도 시간을 조정하려면 기계 간의 시계 스케인을 계산해야합니다. 그렇게하는 방식은 합리적으로 간단합니다. 현재 시간 동안 다른 기계에 문의하고 해당 요청의 왕복 시간을 측정하십시오. 원격 기계에서보고 한 시간이 왕복 시간의 절반에 사실이라고 가정합니다 (이것은 평균적으로 대칭 지연이 항상 사실이 아니지만 네트워크 레이아웃에 깊이 파고 들지 않으면 실제로 더 잘할 수는 없음)를 뺀 것으로 가정합니다. 현재 기계의 시간부터. 그것은 당신의 시계 꼬치입니다. 비다를 여러 번 측정하고 평균을 취하여 연결에 간헐적 지연을 균일하게 제거 할 수 있습니다.

컴퓨터간에 매우 정확한 클럭 동기화가 필요한 경우 GPS를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top