Синхронизация времени между двумя процессами — .NET

У меня есть две программы, написанные на .NET, которые взаимодействуют с оборудованием для сбора данных через USB. Одно устройство является асинхронным, но оно сообщает мне время записи точки данных с точностью до микросекунды. Другой — синхронный, то есть я знаю, когда была записана каждая точка данных.

У меня есть программы .NET для взаимодействия с ними. До сих пор я использовал DateTime.Now, чтобы установить, когда началось сбор данных, затем я использую время в миллисекундах/микросекундах, сообщаемое асинхронным устройством, и номер выборки с синхронного устройства, чтобы вычислить компьютерное время для каждой точки данных (путем добавления тиков к время начала).

Теперь я должен синхронизировать время для двух приобретений. Две программы работают на одном компьютере, но, как я читал, DateTime.Now имеет точность от 10 до 15 миллисекунд, согласно некоторой документации (хотя кажется, что некоторые люди могут добиться значительно большего, чем это, хотя возможно, только потому, что они вызывают его сразу после Thread.Sleep).

Насколько я знаю, мой текущий метод:

  1. Пользователь начинает сбор данных на устройстве 1. Вызывается DateTime.Now
  2. Пользователь начинает сбор данных на устройстве 2. Вызывается DateTime.Now

может дать мне время начала сбора данных с точностью до 15 миллисекунд.

Я могу подумать о том, чтобы использовать DateTime.Now при запуске программы и использовать StopWatch для записи точного времени, прошедшего между запуском программы и началом сбора данных. Но это сработало бы только в том случае, если бы я объединил две программы вместе.

Любые другие идеи?


person darda    schedule 02.03.2011    source источник


Ответы (1)


В StopWatch есть метод GetTimeStamp(), который можно использовать для синхронизации. Он в основном использует Windows API внутри него. В итоге вы получите номер тика типа long, где StopWatch.Frequency — это количество тиков в секунду на вашем компьютере, если вы хотите преобразовать в секунды.

person Carlos    schedule 02.03.2011
comment
Я думал, вы просто используете секундомер для измерения прошедшего времени, а не получаете реальную отметку времени? - person Carlos; 03.03.2011
comment
Я еще не использую секундомер. Я думал объединить DateTime.Now и StopWatch.GetElapsed, чтобы получить неопределенность Now только один раз, и каждый раз после этого у меня была бы точность GetElapsed. Просто интересно, есть ли лучший способ. - person darda; 04.03.2011
comment
Если это то, что вы делаете, я думаю, что есть статьи ТАК об этом, сочетающие DateTime с секундомером. Однако это становится немного сложнее, так как его нужно довольно часто повторно синхронизировать. - person Carlos; 04.03.2011