Форум » Clipper » 5.2e - синхронизация внутренних часов Clipper с компом » Ответить

5.2e - синхронизация внутренних часов Clipper с компом

Sergy: Недавно выяснил, что Clipper при запуске программы инициализирует свои внутренние часы. Сначала время не отличается от системного, но потом понемногу начинает отставать - примерно на 1 минуту за 2 часа. Т.е. функции TIME() или SECONDS() сначала равны системному времени, после часа работы программы - уже нет. Проблема небольшая, но мешает, особенно в свете системы обмена сообщениями между филиалами. Как ее решить ?

Ответов - 7

Григорьев Владимир: Я сейчас по памяти не помню, но скорей всего функция TIME использует известное досовское прерывание, которое возвращает время. Так что отставание по времени с Clipper никак не связано. Что DOS возвращает, то Clipper и показывает. А seconds() оперирует с ячейкой памяти, где "тики" от начала суток хранятся. Естественно, что эти данные берутся с локального компьютера.

Dima: Sergy Может чем то поможет... http://clipper.borda.ru/?1-0-0-00000304-000-0-0 PS Тема твоя похоже :)

Dima: Еще в тему http://clipper.borda.ru/?1-0-0-00000354-000-0-0-1167061003


Григорьев Владимир: Кстати сказать, я не совсем точно привел данные по функциям TIME() и SECONDS() в своем предыдущем сообщении, так как писал по пеамяти На самом деле обе эти функции используют внутреннию функцию Clipper __ostime, которая является оберткой для службы DOS 02Сh прерывания DOS 021h. Это функция просто выполняет эту службу и полученные данные записывает в структуры в виде машинных слов для значений часов, минут, секунд и сотых долей секунд. Функция TIME() затем эти данные переводит в текстовую строку. В то время, как функция SECONDS() переводит эти данные в одно число, которое и возвращает. То есть всегда данные в этих функциях берутся из прерывания 021h с функцией 02Ch.

Григорьев Владимир: Правда все, что я выше написал, относится к Clipper 5.01 и 5.2. Про 5.3 гарантировать не могу, так как нет исходного кода.

Sergy: Да, моя тема... сильное отставание победил ещё тогда. сейчас идет совсем незначительное. Исходники TIME() и SECONDS() не смотрел, но если они точно берут время из ДОС-подсистемы, тогда вопрос - почему отстают часы ДОС-машины и как с этим бороться ?

Григорьев Владимир: То, что в Clipper 5.01 и 5.2 функции TIME() и SECONDS() берут время из прерывания 02Ch системы DOS, то это вне всякого сомнения. Они просто вызывают внутреннюю функцию __ostime(), а затем просто преобразуют полученные данные либо в строку, как имеет место в TIME(), либо в обно число, как имеет место в SECONDS(). Я думаю, что вы можете получить список перекрестных имен в Clipper 5.3 и посмотреть, есть ли среди них функция __ostime(). Дело в том, что Clipper 5.01 и Clipper 5.2 основывают на компиляторе Microsoft C и используют его библиотеки. А в Clipper 5.3 используется то ли более поздний компилятор Microsoft, в котором многие базовые функции переписаны, либо по крайней мере имеют другие названия, либо в Clipper 5.3 уже не используются библиотеки Microsoft, а базовые функции переписаны разработчиками Clipper. Как я уже заметил, про Clipper 5.03 ничего сказать не могу, так как у меня нет его дистрибутива.



полная версия страницы