Хорошо, это длинный путь, но вы можете попробовать реализовать что-то вроде NSSystemClockDidChangeNotification
, доступное в Snow Leopard.
Так что потерпите меня здесь, потому что это странная идея и определенно недерминированная. Но что, если у вас был сторожевой поток, работающий на протяжении всей вашей программы? Этот поток каждые n секунд считывает системное время и сохраняет его. Ради аргумента, давайте просто сделаем это 5 секунд. Таким образом, каждые 5 секунд он сравнивает предыдущее значение с текущим системным временем. Если есть «достаточно большая» разница («достаточно большая» должна определенно быть больше 5, но не слишком много больше, чтобы учесть недетерминированность планирования процессов и приоритезации потоков), напишите уведомление о существенном изменении времени. Вам нужно поиграть с размытым значением, которое составляет «достаточно большое» (или достаточно маленькое, если часы были сброшены на более раннее время) для вашей точности.
Я знаю, что это отчасти хакерство, но, за исключением любого другого решения, как вы думаете? Может ли это или что-то в этом роде решить вашу проблему?
Редактировать
Хорошо, вы изменили свой первоначальный вопрос, сказав, что не хотите использовать сторожевой поток, потому что вы новичок в многопоточности. Я понимаю страх делать что-то более продвинутое, чем вам удобно, но это может оказаться единственным решением. В этом случае вам, возможно, придется немного почитать. =)
И да, я знаю, что что-то такое, как Photoshop, связывающее дерьмо с процессором, является проблемой. Другое (даже более сложное) решение состоит в том, чтобы вместо сторожевого таймера thread иметь отдельный сторожевой таймер process , который имеет высший приоритет, поэтому он немного более защищен от привязки процессора. Но опять же, это становится действительно сложным.
Окончательное редактирование
Я собираюсь оставить все мои другие идеи выше для полноты картины, но, похоже, использование времени работы системы также будет правильным способом справиться с этим. Так как [[NSProcessInfo processInfo] systemUptime]
работает только в 10.6+, вы можете просто позвонить mach_absolute_time()
. Чтобы получить доступ к этой функции, просто #include <mach/mach_time.h>
. Это должно быть то же значение, которое возвращается NSProcessInfo
.