У меня есть кусок кода, который получает длительность от структуры FILETIME. Что это значит?

У меня есть эта функция

void prtduration(const FILETIME *ft_start, const FILETIME *ft_end)
{
double duration = (ft_end->dwHighDateTime - ft_start->dwHighDateTime) *
(7 * 60 + 9 + 496e-3)
+ (ft_end->dwLowDateTime - ft_start->dwLowDateTime) / 1e7;
printf("duration %.1f seconds\n", duration);
system("pause");
}

Кто-нибудь может объяснить работу следующей части кода?

(ft_end->dwHighDateTime - ft_start->dwHighDateTime) *
(7 * 60 + 9 + 496e-3)
+ (ft_end->dwLowDateTime - ft_start->dwLowDateTime) / 1e7;

1

Решение

Вот Это Да! Что за запутанный кусок кода. Давайте попробуем упростить это:

   // Calculate the delta
FILETIME delta;
delta.dwHighDateTime = ft_end->dwHighDateTime - ft_start->dwHighDateTime;
delta.dwLowDateTime = ft_end->dwLowDateTime - ft_start->dwLowDateTime;

// Convert 100ns units to double seconds.
double secs = delta.dwHighDateTime * 429.496 + delta.dwLowDateTime/1E7

На самом деле я думаю, что это неправильно. Так должно быть:

  double secs = delta.dwHighDateTime * 429.4967296 + delta.dwLowDateTime/1E7

Или еще яснее:

  double secs = (delta.dwHighDateTime * 4294967296. + delta.dwLowDateTime)/10E6

Происходит то, что время умножается на 2**32 (который преобразуется в 100 нс единиц, а затем делится на 100 нс, чтобы дать секунды.

Обратите внимание, что это еще неправильно, потому что расчет delta неправильно (так же, как оригинал). Если вычитание нижней части недостаточно, оно не заимствует из верхней части. Смотрите документацию Microsoft:

Не рекомендуется добавлять и вычитать значения из структуры FILETIME для получения относительного времени. Вместо этого вы должны скопировать младшие и старшие части времени файла в структуру ULARGE_INTEGER, выполнить 64-разрядную арифметику для члена QuadPart и скопировать члены LowPart и HighPart в структуру FILETIME.

Или на самом деле, в этом случае, просто конвертируйте QuadPart в удвоение и деление. Итак, мы заканчиваем с:

    ULARGE_INTEGER start,end;
start.LowPart  = ft_start->dwLowDateTime;
start.HighPart = ft_start->dwHighDateTime;
end.LowPart = ft_end->dwLowDateTime;
end.HighPart = ft_end->dwHighDateTime;

double duration = (end.QuadPart - start.QuadPart)/1E7;

Кроме того: могу поспорить, что причина того, что заимствование никогда не было обнаружено, заключается в том, что код никогда не просили напечатать длительность более 7 минут 9 секунд (или, если это так, никто не посмотрел внимательно на результат).

5

Другие решения

7 очень приблизительно частота, когда переменная FileTime меняет свое значение. А именно, каждые 7 (+ -3 или даже больше) минут он увеличивается на 1. Чем мы умножаем его на 60 для получения значения в секундах.

9 + 496e-3 — is time — секунды, которые как-то связаны с компиляцией (от начала вывода до вывода в консоли), которую мы теряем.

На самом деле, это очень плохой код, и мы не должны так писать.

Однако это заставило меня лучше узнать о работе FileTime.

Спасибо всем за ответы, я очень ценю это.

0

По вопросам рекламы [email protected]