Автор | Сообщение |
|
| |
Пост N: 82
Зарегистрирован: 08.07.06
|
|
Отправлено: 22.09.10 22:58. Заголовок: 5.2e - синхронизация внутренних часов Clipper с компом
Недавно выяснил, что Clipper при запуске программы инициализирует свои внутренние часы. Сначала время не отличается от системного, но потом понемногу начинает отставать - примерно на 1 минуту за 2 часа. Т.е. функции TIME() или SECONDS() сначала равны системному времени, после часа работы программы - уже нет. Проблема небольшая, но мешает, особенно в свете системы обмена сообщениями между филиалами. Как ее решить ?
|
|
|
Ответов - 7
[только новые]
|
|
|
| постоянный участник
|
Пост N: 366
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.09.10 20:45. Заголовок: Я сейчас по памяти н..
Я сейчас по памяти не помню, но скорей всего функция TIME использует известное досовское прерывание, которое возвращает время. Так что отставание по времени с Clipper никак не связано. Что DOS возвращает, то Clipper и показывает. А seconds() оперирует с ячейкой памяти, где "тики" от начала суток хранятся. Естественно, что эти данные берутся с локального компьютера.
|
|
|
|
| |
Пост N: 1881
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.09.10 21:05. Заголовок: Sergy Может чем то ..
|
|
|
|
| |
Пост N: 1882
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.09.10 21:16. Заголовок: Еще в тему http://cl..
|
|
|
|
| постоянный участник
|
Пост N: 367
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.09.10 16:17. Заголовок: Кстати сказать, я не..
Кстати сказать, я не совсем точно привел данные по функциям TIME() и SECONDS() в своем предыдущем сообщении, так как писал по пеамяти На самом деле обе эти функции используют внутреннию функцию Clipper __ostime, которая является оберткой для службы DOS 02Сh прерывания DOS 021h. Это функция просто выполняет эту службу и полученные данные записывает в структуры в виде машинных слов для значений часов, минут, секунд и сотых долей секунд. Функция TIME() затем эти данные переводит в текстовую строку. В то время, как функция SECONDS() переводит эти данные в одно число, которое и возвращает. То есть всегда данные в этих функциях берутся из прерывания 021h с функцией 02Ch.
|
|
|
|
| постоянный участник
|
Пост N: 368
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.09.10 19:26. Заголовок: Правда все, что я вы..
Правда все, что я выше написал, относится к Clipper 5.01 и 5.2. Про 5.3 гарантировать не могу, так как нет исходного кода.
|
|
|
|
| |
Пост N: 85
Зарегистрирован: 08.07.06
|
|
Отправлено: 02.10.10 19:37. Заголовок: Да, моя тема... силь..
Да, моя тема... сильное отставание победил ещё тогда. сейчас идет совсем незначительное. Исходники TIME() и SECONDS() не смотрел, но если они точно берут время из ДОС-подсистемы, тогда вопрос - почему отстают часы ДОС-машины и как с этим бороться ?
|
|
|
|
| постоянный участник
|
Пост N: 369
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.10.10 15:42. Заголовок: То, что в Clipper 5...
То, что в 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 ничего сказать не могу, так как у меня нет его дистрибутива.
|
|
|
|