Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2015, 18:34   #1
Antony41
Пользователь
 
Аватар для Antony41
 
Регистрация: 20.03.2009
Сообщений: 99
По умолчанию Контроль часов

Хочу сделать защиту от перевода часов
План реализации следующий:
при запуске программы в отдельном потоке фиксируем дату открытия OpenDT
Затем через каждую секунду начинаем прибавлять к NowDTTick := OpenDT + 1 секунда

Для проверки часов от перевода проверяем NowDTTick и Now (текущее время которое сейчас на компе)
Например if NowDTTick < Now + (погрешность) значит часы перевели назад

Известно что для обеспечения возможности "многозадачности" система переключается между процессами через переодическое время, соответственно потоки впадают в suspended, приостановленное состояние, а значит работа потока будет притормаживать и через некоторое время начнет иметь существенное отличие от реального времени.

Вопрос: Возможно ли каким либо способом данный способ контроля времени потоком более точным?
ЗЫ Условие: без выхода в интернет.

Есть идея проверять например через 3-10 секунды проверку на отличие от локального времени, если отличие не более чем на две три секунды, то снова берем и отталкиваем OpenDT от времени компа.

Вобщем товарищи подскажите как бы правильнее сделать.
Antony41 вне форума Ответить с цитированием
Старый 11.06.2015, 18:55   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

GetTickCount и время при старте запомнить. При проверке сравнить разницу между текущим GetTickCount и начальным с разницей времен текущего и начального. GetTickCount по-моему dword и милисекунды, поэтому при переполнении в ноль сбрасывается. Через 49 суток непрерывной работы если не ошибся
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.06.2015, 19:28   #3
Antony41
Пользователь
 
Аватар для Antony41
 
Регистрация: 20.03.2009
Сообщений: 99
По умолчанию

Ща попробую через GetTickCount збацать
Antony41 вне форума Ответить с цитированием
Старый 11.06.2015, 22:03   #4
Antony41
Пользователь
 
Аватар для Antony41
 
Регистрация: 20.03.2009
Сообщений: 99
По умолчанию

В общем получился примерно такой код

Код:
OpenDT := Now;
NowTickDT := OpenDT;
Tick := GetTickCount;
Tick2 := GetTickCount;
while not Terminated do
  begin
	if (GetTickCount - Tick2) > 1000 then
	  begin
		Tick2 := GetTickCount;
		NowTickDT := IncSecond(OpenDT, (GetTickCount - Tick) div 1000);
		ShowMyMessage(0, C_MSG_STATUS, 'NowTickDT: '+DateTimeToStr(NowTickDT));
	  end
	else sleep(10);
  end;
Щас проведу тест несколько часов посмотрю как расходится системное время с программным
но результат уже лучше пока отличий не видно

Последний раз редактировалось Antony41; 11.06.2015 в 22:26.
Antony41 вне форума Ответить с цитированием
Старый 11.06.2015, 22:29   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А зачем так часто проверка? Раз в несколько минут по таймеру вполне достаточно без этих sleep
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.06.2015, 10:08   #6
Antony41
Пользователь
 
Аватар для Antony41
 
Регистрация: 20.03.2009
Сообщений: 99
По умолчанию

не совсем понял как обойтись без sleep, ведь тогда будет грузить ЦП на 100% в цикле While, не лучший вариант решения конечно...
Antony41 вне форума Ответить с цитированием
Старый 12.06.2015, 10:09   #7
Antony41
Пользователь
 
Аватар для Antony41
 
Регистрация: 20.03.2009
Сообщений: 99
По умолчанию

Кстати тест с GetTickCount'ом за ~12 часов показал очень хорошие результаты, я не заметил разницы между программным временем и системным
Antony41 вне форума Ответить с цитированием
Старый 12.06.2015, 15:25   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Antony41 Посмотреть сообщение
не совсем понял как обойтись без sleep, ведь тогда будет грузить ЦП на 100% в цикле While, не лучший вариант решения конечно...
И цикл выкинуть.
Вместо цикла повесить процедуру проверки на таймер.
Без всяких SLEEP!
Вот и всё!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.06.2015, 16:39   #9
Antony41
Пользователь
 
Аватар для Antony41
 
Регистрация: 20.03.2009
Сообщений: 99
По умолчанию

Я понял, но тут еще и другие задачи будут стоять, поэтому необходимо всё это сделать в потоке в зацикленном, кроме этого данный поток будет через некоторое время посылать другому потоку информацию о текущем времени, а второй поток будет принимать и сохранять данную дату как время последнего выхода из программы CloseDT, это нужно для возможности проверки не перевел ли пользователь часы назад в то время когда программа была выключена. И при запуске программа будет смотреть если CloseDT > Now, значит он перевел часы назад в то время когда прога не работала. Незнаю конечно правильно ли оно всё, но это алгоритм придуманный мной и теоретически должно всё работать.
Вобще будет 3 потока третий будет синхронизировать параметры с сервером лицензирования (при доступном инете)
Такая частая проверка была нужна только для теста
Antony41 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
суммирование часов и минут по нарастающей, более 24 часов razinsergey Microsoft Office Excel 3 28.05.2012 10:02
создание часов noxior Общие вопросы C/C++ 5 11.02.2012 15:53
Сколько часов, минут и секунд прошло от начала суток до поворота часовой стрелки часов на f градусов (нужна блок-схема) lady.ulumba Помощь студентам 5 08.09.2011 15:08
Стрелка часов jonec Общие вопросы Delphi 2 17.11.2010 09:45
часы показывают m часов, n минут и k секунд. Каковы будут показатели часов через p часов, q минут и r сек Паскалька^^ Помощь студентам 3 11.10.2009 19:41