Вычисление числа секунд между двумя моментами времени, в Какао, даже когда системные часы изменились на полпути

Это является, конечно, не 'самым самым твердым', но просто что-то для добавления к списку:

ThenBy() extension method

, не смотря на его реализацию я первоначально озадачен относительно того, как она работает. Все понимают очень хорошо, как запятая разделила работу полей сортировки в SQL - но на номинальной стоимости я скептически настроен, что ThenBy собирается сделать то, что я действительно хочу, чтобы это сделало. Как может он 'знать' то, чем было предыдущее поле сортировки - кажется, что это должно.

я прочь для исследования его теперь...

10
задан Marc W 26 October 2009 в 22:59
поделиться

3 ответа

Я нашел способ сделать это с помощью функции C UpTime () , представленной в . Это возвращает абсолютное время (зависящее от процессора), которое можно легко преобразовать во время продолжительности (миллисекунды или наносекунды). Подробности здесь: http://www.meandmark.com/timingpart1.html (время UpTime ищите в части 3)

Мне не удалось заставить mach_absolute_time () работать должным образом , вероятно, из-за того, что я не знаю об этом, и не могу найти много документации по нему в Интернете. Кажется, что он захватывает то же время, что и UpTime () , но преобразование его в двойное оставило меня ошеломленным.

[[NSApp currentEvent] отметка времени] действительно работала, но только если приложение получало NSEvents. Если бы приложение перешло на передний план, оно не получало бы событий, и [[NSApp currentEvent] timestamp] просто продолжало бы возвращать ту же самую старую временную метку снова и снова в методе запуска NSTimer до конца. -пользователь снова решил взаимодействовать с приложением.

Спасибо за вашу помощь, Марк и Майк! Вы оба определенно направили меня в правильном направлении, ведущем к ответу. :)

1
ответ дан 4 December 2019 в 02:26
поделиться

Depending on what's driving this code, you have 2 choices:

  • For absolute precision, use mach_absolute_time(). It will give the time interval exactly between the points at which you called the function.
  • But in a GUI app, this is often actually undesirable. Instead, you want the time difference between the events that started and finished your duration. If so, compare [[NSApp currentEvent] timestamp]
5
ответ дан 4 December 2019 в 02:26
поделиться

Хорошо, это долгий путь, но вы можете попробовать реализовать что-то вроде NSSystemClockDidChangeNotification , доступного в Snow Leopard.

Так что терпите меня, потому что это это странная идея и определенно недертерминированная. Но что, если бы у вас была нить сторожевого пса на протяжении всей программы? Этот поток каждые n секунд считывал системное время и сохранял его. Ради аргумента, давайте просто сделаем 5 секунд. Таким образом, каждые 5 секунд он сравнивает предыдущее показание с текущим системным временем. Если есть «достаточно большая» разница («достаточно большая» должна определенно быть больше 5, но не слишком сильно , чтобы учесть недетерминизм планирования процессов и приоритезации потоков), разместить уведомление о значительном изменении времени. Вам нужно будет поиграть с фаззингом значения, которое составляет «достаточно большое» (или достаточно маленькое, если часы были сброшены на более раннее время) для вашей точности.

Я знаю, что это своего рода хакерство, но запрещает любые другое решение, как вы думаете? Может ли это или что-то в этом роде решить вашу проблему?

Edit

Итак, вы изменили исходный вопрос, указав, что вы не хотите использовать сторожевой поток, потому что вы новичок в многопоточности. Я понимаю страх сделать что-то более сложное, чем вам удобно, но это может оказаться единственным решением. В этом случае вам, возможно, придется немного почитать. =)

И да, я знаю, что что-то вроде Photoshop, вытаскивающего дерьмо из процессора, является проблемой. Другое (даже более сложное) решение могло бы состоять в том, чтобы вместо сторожевого потока иметь отдельный сторожевой таймер процесс , имеющий наивысший приоритет, чтобы он был немного более невосприимчивым к привязке процессора. Но опять же, это становится действительно сложным.

Final Edit

Я собираюсь оставить все мои другие идеи, приведенные выше, для полноты, но похоже, что использование времени безотказной работы системы также будет действенным способом решения этот. Поскольку [[NSProcessInfo processInfo] systemUptime] работает только в версии 10.6+, вы можете просто вызвать mach_absolute_time () . Чтобы получить доступ к этой функции, просто #include . Это должно быть то же значение, которое возвращает NSProcessInfo .

вместо сторожевого потока используйте отдельный сторожевой процесс , который имеет высший приоритет, чтобы он был немного более защищен от привязки процессора. Но опять же, это становится действительно сложным.

Final Edit

Я собираюсь оставить все мои другие идеи, приведенные выше, для полноты, но похоже, что использование времени безотказной работы системы также будет действенным способом решения этот. Поскольку [[NSProcessInfo processInfo] systemUptime] работает только в версии 10.6+, вы можете просто вызвать mach_absolute_time () . Чтобы получить доступ к этой функции, просто #include . Это должно быть то же значение, которое возвращает NSProcessInfo .

вместо сторожевого потока используйте отдельный сторожевой процесс , который имеет высший приоритет, чтобы он был немного более защищен от привязки процессора. Но опять же, это становится действительно сложным.

Final Edit

Я собираюсь оставить все мои другие идеи, приведенные выше, для полноты, но похоже, что использование времени безотказной работы системы также будет действенным способом решения этот. Так как [[NSProcessInfo processInfo] systemUptime] работает только в 10.6+, вы можете просто вызвать mach_absolute_time () . Чтобы получить доступ к этой функции, просто #include . Это должно быть то же значение, которое возвращает NSProcessInfo .

это становится действительно сложным.

Final Edit

Я собираюсь оставить все мои другие идеи, приведенные выше для полноты, но похоже, что использование времени безотказной работы системы также будет действенным способом справиться с этим. Так как [[NSProcessInfo processInfo] systemUptime] работает только в 10.6+, вы можете просто вызвать mach_absolute_time () . Чтобы получить доступ к этой функции, просто #include . Это должно быть то же значение, которое возвращает NSProcessInfo .

это становится действительно сложным.

Final Edit

Я собираюсь оставить все мои другие идеи, приведенные выше для полноты, но похоже, что использование времени безотказной работы системы также будет действенным способом справиться с этим. Так как [[NSProcessInfo processInfo] systemUptime] работает только в 10.6+, вы можете просто вызвать mach_absolute_time () . Чтобы получить доступ к этой функции, просто #include . Это должно быть то же значение, которое возвращает NSProcessInfo .

вы можете просто вызвать mach_absolute_time () . Чтобы получить доступ к этой функции, просто #include . Это должно быть то же значение, которое возвращает NSProcessInfo .

вы можете просто вызвать mach_absolute_time () . Чтобы получить доступ к этой функции, просто #include . Это должно быть то же значение, которое возвращает NSProcessInfo .

2
ответ дан 4 December 2019 в 02:26
поделиться