Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];

Вниз

Контроль за временем   Найти похожие ветки 

 
joint   (2003-02-26 12:37) [0]

Народ, если кто может натолкнуть на мысль, буду очень благодарен.
Проблема у меня такая-программа в процессе работы должна фиксировать возможный перевод времени(пользователем или другой программой, неважно). Я делаю следующее-"завожу" таймер например на 2 сек. и сверяю прирост системного времени с этими 2 секундами; в результате перевод времени часто фиксируется, когда его нет-причина понятна, непонятно как этого избежать. Если я правильно понимаю, использование user таймера в данном случае было не самым умным решением:(. Если кто сталкивался с подобным, подскажите, может стоит использовать Виртуальный таймер или вообще другой подход.


 
Anatoly Podgoretsky   (2003-02-26 13:01) [1]

Вполне нормально, только зачем так часто


 
joint   (2003-02-26 13:30) [2]

Про 2 секунды я для примера написал, на самом деле я пробовал ставить таймер от 1 до 10 секунд и сравнивал с чуть большим числом(умножал на 1.1-1.4). Так этот код работает, просто выходит что если машина слабее P2 или Celeron и к тому же пользователь более-менее интенсивно что-то делает(не в моей программе, а в какой-то другой), то раз в 20-30 минут фиксируется перевод на 1-3 секунды( что в принципе было бы ерундой, если бы при этом моя программа не переводила время на то, которое она считает правильным:(, а от этого я не могу отказаться. В результате через месяц-другой системное время отстает от нормального на несколько минут.. Я просто сейчас поотлавливал другие баги в программе и решил засесть за этот


 
Anatoly Podgoretsky   (2003-02-26 13:33) [3]

Не надо ничего мудрить, в ОС есть для этого встроенные средства, покопайся с администрированием.


 
han_malign   (2003-02-26 13:51) [4]

таймер работает через очередь сообщений приложения и промежутки между приходом WM_TIMER могут быть от 55 миллисекунд(из-за нагруженности системы накопилось несколько сообщений) до 30 и больше секунд(система перегружена, приложение не получает квантов), в зависимости от загруженности системы.

вообще есть
An application sends the WM_TIMECHANGE message to all top-level windows after changing the system time.
- но это, если другое приложение изменяющее время, выполняет данное требование и посылает сообщение (An application that changes the system time should send this message to all top-level windows.)... И опять-таки - all top-level windows, а не всем...


 
REA   (2003-02-26 13:55) [5]

А зачем переводить его обратно? Если юзер перевел время, значит ему это надо. Из BIOS можно более точное время достать под W98.


 
han_malign   (2003-02-26 14:00) [6]

З.Ы. Реальное время прошедшее между событиями таймера можно отслеживать по GetTickCount.


 
joint   (2003-02-26 15:05) [7]

Спасибо, попробую..


 
joint   (2003-02-26 22:51) [8]

Очнеь прикольные ответы встречаются-почти как в анектодоте про службу тех. поддержки- если ничего не выходит, попробуйте перезагрузить компьютер...:) единиственное , что нового(для меня ) от han_malign, не знаю что выйдет, но хоть что-то более полезное чем почитать manual.. , или типа если User сам знает зачем ему время переводить..(просто цирк, если уважаемый REA не понимает, что например в букмкерском или в обмене валют бизнесе то, что User хочет, меня не очень волнует, тем более, что от от того, что User переставит время так как ему удобно, можно попасть на нормальные деньги....). В любом случае спасибо всем ( в первую очередь han_malign), кто не поленился черкануть пару строчек.


 
SeF   (2003-02-26 23:48) [9]

В WinNT можно разрешить менять время только определенным пользователям.......


 
Романов Р.В.   (2003-02-26 23:51) [10]

Точность таймера не имеет знначения. Определить на сколько было изменено время можно следующим способом.

var
LastTickCount: LongWord;
LastTime: TDateTime;
function TimeInterval: TDateTime;
var
tTime: TDateTime;
tTickCount: LongWord;
begin
tTime := Now;
tTickCount := GetTickCount;
Result := (tTime - LastTime) - (tTickCount - LastTickCount) / MSecsPerDay;
LastTime := tTime;
LastTickCount := tTickCount;
end;

Если результат фунции отличается от 0, то время было изменено. Реальное время (которое бы было до изменения) равно Now + TimeInterval;
Вызывать эту функцию можно как по таймеру, при получении сообщения WM_TIMECHANGE или каждый раз перед тем как использовать системное время в программе, но не реже 1 раза в 49 дней.

PS: А вообще то Anatoly Podgoretsky © (26.02.03 13:33) прав.


 
ЮЮ   (2003-02-27 07:47) [11]

>просто цирк, если уважаемый REA не понимает, что например в букмкерском или в обмене валют бизнесе то, что User хочет, меня не очень волнует, тем более, что от от того, что User переставит время так как ему удобно, можно попасть на нормальные деньги....

Странно, что букмекер спрашивает у клиента "Который час". Он бы у него ещё исходом матча поинтересовался :-)


 
Anatoly Podgoretsky   (2003-02-27 10:10) [12]

joint © (26.02.03 22:51)
Очень странная букмекерская конторая или пункт обмена валют, похоже на лохотрон.
Недопустимо использовать неподходящии операционные системы и некомпетентных системных администраторов.


 
REA   (2003-02-27 10:13) [13]

>уважаемый REA не понимает, что например в букмкерском или в обмене валют бизнесе то, что User хочет, меня не очень волнует

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


 
joint   (2003-02-28 10:29) [14]

Народ, во-первых приношу свои извинения, если я кого-то случайно обидел или недопустимо резко выразился..
Хочу немного пояснить,зачем мне все это нужно -в первую очередь именно для контроля за кассиром, который сидит за кассой, которая может находится очень далеко от Администратора, в общем случае даже ни разу в жизни не видавшего этого кассира. И в данном случае я исхожу из предположения, что рано или поздно у практически у любого кассира возникнут "нехорошие" мысли на тему как бы немного лишнего подзаработать. Согласен, что букмекер не будет спрашивать у клиента, который час, тут дело в другом-этот кассир, например, переводит время назад и делает свою ставку на событие, р-т которого уже известен:(( Я хочу по крайней мере знать, было это или нет. Понятно, что абсолютно быть в этом уверенным не выйдет, какие бы хитроумные приемы не придумывать, но все-таки хочется хоть немного защититься.
P.S. Еще раз спасибо, что давали советы.


 
han_malign   (2003-02-28 11:16) [15]

Ну тогда, облом бабка - мы на корабле...(из анекдота)
Что помешает перезагрузить компьютер и сменить время в BIOS(кроме легко обходимого пароля), разве что сохранить последний штамп времени (в файле или реестре) и измененное время будет более ранним (кстати система ругнется на неправильный штамп времени системных файлов)
З.Ы. А чтобы обнаружить достаточно вести лог со штампами времени, при подобном мухлеже всегда будет нарушение времени последовательности событий...


 
joint   (2003-02-28 11:51) [16]

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


 
mrcat   (2003-02-28 12:03) [17]

joint © (26.02.03 13:30)

была подобная проблема, но другие условия: сеть, где необходимо запретить перевод времени на всех локальных компьютерах - ввел централизованную проверку времени на сервере с проверкой ЭЦП (электронно-цифровой подписи) клиента/сервера; работает около года - попыток несанкционированного перевода времени нет ;)


 
Anatoly Podgoretsky   (2003-02-28 12:06) [18]

joint © (28.02.03 10:29)
Для действительно важных систем, грозящих финансовыми проблемами должны быть выполнены некоторые условия
1. Оператор не должен иметь возможности менять время.
2. Время для критических операций не должно браться с рабочего компьютера, а только с внешнего источника, например из эталонных часов, на другом контролируемым компьютере

Иначе готовьте бабки!


 
han_malign   (2003-02-28 12:08) [19]

GPS (на COM) - не так дорого стоит...


 
joint   (2003-02-28 13:15) [20]

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



 
mrcat   (2003-02-28 13:21) [21]

joint © (28.02.03 13:15)
2- в процессе работы или не дает менять время или( наверное это более предпочтительно) если есть подозрение на изменение времени, требует повторить п.1.


Вопрос весь в том, как ты собираешся реализовать п.2., точнее - какой подход выберешь...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.63 MB
Время: 0.048 c
6-30004
SaperXL
2003-01-20 04:01
2003.03.10
Get запросы


3-29714
vladimirS
2003-02-19 08:16
2003.03.10
IBRestoreService лаждый раз разный размер БД ...


3-29718
Andrey V.
2003-02-17 21:06
2003.03.10
Проектирование БД


4-30177
maxim2
2003-01-20 13:21
2003.03.10
Подскажите что в этом коде не так.


14-30013
Дмитрий К.К.
2003-02-24 06:21
2003.03.10
Именинники 24 февраля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский