OberonCore
https://forum.oberoncore.ru/

Большой проект на BlackBox
https://forum.oberoncore.ru/viewtopic.php?f=27&t=1170
Страница 5 из 5

Автор:  Vlad [ Четверг, 13 Ноябрь, 2008 15:50 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Александр Ильин писал(а):
Чтобы записи в БД шли со строго неубывающими метками времени, было принято решение брать системное время в момент запуска программы, а далее отсчитывать секунды тиками (тот самый GetTickCount) и хранить собственное "отмеренное" время.


А почему, собственно, не писать в базу системное время в момент запуска программы, а потом туда же тики (плюс, может быть, и реальное системное время)? Это бы явно отражало суть происходящего в момент записи и, наверное, упрощало бы обработку (коли уж она завязана на неубывающее время). Кроме того, во время последующей обработки можно было бы проявить стольно интеллекта, сколько потребуется (вплоть до определения моментов смены системного времени).

Автор:  Александр Ильин [ Четверг, 13 Ноябрь, 2008 16:09 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Vlad писал(а):
А почему, собственно, не писать в базу системное время в момент запуска программы, а потом туда же тики (плюс, может быть, и реальное системное время)?
Это бы сильно усложнило как структуру БД, так и обработку. А дополнительное системное время вообще не понятно, зачем нужно, и как обрабатывать и отображать (на графиках) возможные расхождения. По оси абсцисс у нас время, а по оси ординат - значения технологических параметров. Зачем нам несколько осей абсцисс? Нам нужно, чтобы графики ползли строго направо, без всяких скачков влево, а скачок вправо всегда бы означал отсутствие связи либо перерыв в записи.

БД получилась очень "мобильная": один файл = одни сутки. Легко копировать и архивировать. Заводить какую-то дополнительную таблицу с информацией о "путешествиях во времени"... Она же ничего не добавляет к информации о прошедших технологических процессах (главная задача БД - хранить именно эту информацию). Выводить в БД какие-то детали реализации программы - значит усложнять вспомогательный инструментарий, который потом будет эти данные обрабатывать. (Такие узкоспециализированные инструменты тоже были написаны - например, экспорт в CSV.)

Вот такие соображения.

Автор:  Vlad [ Четверг, 13 Ноябрь, 2008 17:12 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Александр Ильин писал(а):
А дополнительное системное время вообще не понятно, зачем нужно, и как обрабатывать и отображать (на графиках) возможные расхождения.


Я сказал "может быть" :) А если надо просто построить график - то как раз достаточно просто тиков ;) Тем более, что время на графике вы скорее всего захотите увидеть относительное. А вот если все-таки хочется на графике видеть абсолютное системное время, то лучше таки писать в базу реальное время и его же показывать (а строить график по тикам).
Против "своего" времени в базе у меня только одно возражение - оно может сбить с толку при "разборе полета". Например, если все упало в 12:00, а последняя запись в базе датирована 12:05, то это заставит крепко призадуматься тех, кто не в курсе такой "особенности".

Автор:  Trurl [ Четверг, 13 Ноябрь, 2008 17:26 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Александр Ильин писал(а):
Да, по атомным. Читайте пост внимательнее.

А почему Вы считаете системное время более точным? Оно управляется теми же тиками.
Другое дело, что система может периодически синхронизировать системное время с сервером времени или с RTC.

Автор:  Geniepro [ Пятница, 14 Ноябрь, 2008 09:20 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Александр Ильин писал(а):
Trurl писал(а):
А сутки Вы по атомным часам отмеряли?
Да, по атомным. Читайте пост внимательнее.

А Вы, что же, подключили к компьютеру атомные часы?

Автор:  Александр Ильин [ Пятница, 14 Ноябрь, 2008 11:09 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Geniepro писал(а):
Александр Ильин писал(а):
Trurl писал(а):
А сутки Вы по атомным часам отмеряли?
Да, по атомным. Читайте пост внимательнее.
А Вы, что же, подключили к компьютеру атомные часы?
Шутка заключается в том, что для обсуждаемой в посте проблемы точность измерения суток не важна.

Автор:  Александр Ильин [ Пятница, 14 Ноябрь, 2008 11:38 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

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

А если компьютер несколько раз за сутки перезапускали и счётчик GetTickCount, соответственно, сбрасывался? Значит, нужна дополнительная таблица, в которую при каждом запуске программы записывается текущее время и тик начала отсчёта, этому времени соответствующий. При моей реализации просто глядя в таблицу с данными, и делая к ней простейшие SQL-запросы можно взять, скажем, данные за нужный интервал времени. В вашем варианте для этой типичной задачи потребуется гораздо более сложный алгоритм, работающий с двумя таблицами - и я не уверен, что на SQL его можно написать. А задача эта выполняется всякий раз, когда пользователь хочет посмотреть чуть более старые данные.

Всё-таки я не представляю себе. Вот пользователь, скажем, в 15:55 поправил системное время на 5 минут назад. И стало 15:50. Запись производится кадждые 5 секунд. Стало быть, в БД у нас появится по два значения для каждого графика в интервале с 15:50 до 15:55. По тикам всё замечательно - тики увеличиваются, но как отобразить это на графиках, где ось абсцисс - время? Сделать на оси абсцисс два интервала 15:50-15:55? Или сделать на графиках временной зигзаг?

Задача интересная. Тут я впервые столкнулся с тем, что системное время - это тоже вид ресурса, который нужно захватывать.

Автор:  Geniepro [ Пятница, 14 Ноябрь, 2008 12:29 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Александр Ильин писал(а):
Шутка заключается в том, что для обсуждаемой в посте проблемы точность измерения суток не важна.

Тогда в чём проблема-то с +-4 секундами в сутки? Это вполне может быть Вашей погрешностью измерения продолжительности суток...

Автор:  Geniepro [ Пятница, 14 Ноябрь, 2008 12:33 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Александр Ильин писал(а):
Задача интересная. Тут я впервые столкнулся с тем, что системное время - это тоже вид ресурса, который нужно захватывать.

Тут у Вас единственным реальным решением может быть только внешнее устройство (часы реального времени), к которому пользователь не имеет доступа...

Автор:  Александр Ильин [ Пятница, 14 Ноябрь, 2008 13:31 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Geniepro писал(а):
Александр Ильин писал(а):
Шутка заключается в том, что для обсуждаемой в посте проблемы точность измерения суток не важна.
Тогда в чём проблема-то с +-4 секундами в сутки? Это вполне может быть Вашей погрешностью измерения продолжительности суток...
Ещё раз повторяю - точность измерения длины суток не имеет никакого значения.

Берём в произвольный момент времени С1 := GetTickCount и T1 := текущее время по системным часам. Приблизительно через сутки, а можно и через двое или трое, снова берём С2 := GetTickCount и T2 := текущее время по системным часам.

Вычисляем прошедшее количество секунд между T1 и T2: deltaT := секунды(T2 - T1).
Вычисляем прошедшее количество секунд между C1 и C2: deltaC := (C2 - C1) DIV 1000.
Видим, что deltaC = deltaT + 4.

Какая разница, с какой точностью взяты сутки? Важен сам факт наличия погрешности и её приблизительный порядок. Если кому-то интересно точное значение погрешности - пусть измеряет. Я просто говорю, что за сутки около 4 секунд может набегАть.

Если бы разница была в пределах одной секунды, это можно было бы списать на погрешность DIV 1000. Но 4 секунды - это явное свидетельство расхождения системного и тикового времён. В пределах одного компьютера и одного сеанса работы. При чём тут атомные или настенные часы?

Неужели я так плохо объясняю?

Автор:  Александр Ильин [ Пятница, 14 Ноябрь, 2008 13:32 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Geniepro писал(а):
Тут у Вас единственным реальным решением может быть только внешнее устройство (часы реального времени), к которому пользователь не имеет доступа...
Да, это был бы наиболее надёжный вариант.

Автор:  Geniepro [ Пятница, 14 Ноябрь, 2008 14:22 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Александр Ильин писал(а):
Неужели я так плохо объясняю?
Вот сецчас Вы понятно объяснили, а до этого Вы, видимо, считали нас телепатами...

Автор:  Trurl [ Пятница, 14 Ноябрь, 2008 14:44 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Александр Ильин писал(а):
Какая разница, с какой точностью взяты сутки? Важен сам факт наличия погрешности и её приблизительный порядок. Если кому-то интересно точное значение погрешности - пусть измеряет. Я просто говорю, что за сутки около 4 секунд может набегАть.


Просто термин "погрешность" выбран неудачно. ;)

Автор:  Александр Ильин [ Пятница, 14 Ноябрь, 2008 14:50 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Geniepro писал(а):
Александр Ильин писал(а):
Неужели я так плохо объясняю?
Вот сецчас Вы понятно объяснили, а до этого Вы, видимо, считали нас телепатами...
Процитирую сам себя (из одного-единственного поста) с выделением жирным
Александр Ильин писал(а):
...Чтобы записи в БД шли со строго неубывающими метками времени, было принято решение брать системное время в момент запуска программы, а далее отсчитывать секунды тиками (тот самый GetTickCount) и хранить собственное "отмеренное" время...
Метод измерения: программа раз в сутки перезапускалась, и при завершении работы выводила в журнал своё внутреннее время и системное время с точностью до секунды. Регулярно наблюдаемая разница > 1 секунды говорила о том, что пользователь тут ни при чём...
Если есть постоянно включенный компьютер, то можно написать простенькую программу, которая будет показывать тиковое время. Или ещё проще: поставить в автозапуск программу, которая запомнит системное время и соответствующее ему значение GetTickCount. Далее в любой момент времени можно взять текущие значения и сравнить с точкой отсчёта: сколько по системным часам, и сколько по тиковым.
Sapienti sat.

Автор:  Trurl [ Пятница, 14 Ноябрь, 2008 16:31 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Давайте разбираться. Под "системным временем" будем подразумевать то, что возвращает GetSystemTime. При запуске Windows считывает из CMOS показания "Real Time Clock" и устанавливает системное время. Далее, каждые 55 милисекунд обновляется как системное время, так и "счетчик тиков". Пока никто не вмешивается, имеет место полная синхронность. Конечно, любая программа может сделать SetSystemTime и все, привет.

Кроме того, примерно раз в час Windows, если ему не запретить, лезет в CMOS и "синхронизирует" системное время. Что, вообще говоря, глупо, ибо часики в CMOS тикают посекундно.
А еще бывает запущена служба времени, которая периодически синхронизирует системное время с сервером.

Автор:  Vlad [ Пятница, 14 Ноябрь, 2008 16:58 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Александр Ильин писал(а):
А если компьютер несколько раз за сутки перезапускали и счётчик GetTickCount, соответственно, сбрасывался?


А если его перезпускали и меняли время? ;) Можно писать в базу не абсолютные тики, а относительно предыдущего отсчета. Тогда будет одна таблица и с перезагрузками все хорошо.

Александр Ильин писал(а):
При моей реализации просто глядя в таблицу с данными, и делая к ней простейшие SQL-запросы можно взять, скажем, данные за нужный интервал времени.


Так и в случае "тики + время" - это тоже простейший SQL. Просто в случае "неправильного" интервала вернется более одного отсчета на одно абсолютное время. Что на самом деле будет более честно. Т.е., если часы были переведены в 3 часа на час назад и пользователь делает запрос "с 2 до 3", то ему вернется интервал размером в 2 часа, в котором отсчеты будут идти с 2 до 3, а потом опять с 2 до 3. График будет построен по тикам, поэтому с ним все просто. Со временной шкалой тоже ничего сложного нет. Выбираем масштаб, например 5 минут. Идем последовательно по данным полученного интервала и ищем отсчет с ожидаемым абсолютным временем - "текущее время + 5 минут". Если время очередного отсчета отличается от "текущего времени" более чем на 5 минут - корректируем "текущее время".

Автор:  rv82 [ Среда, 28 Январь, 2009 08:00 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Возник ещё один вопрос. Дело в том, что мне нужна поддержка реального времени настолько, насколько только возможно её реализовать в Windows. А потому, для создания потоков хочу попробовать WinAPI. Внимание, вопрос: как с такими потоками будет работать сборщик мусора? Справится ли?

Автор:  Илья Ермаков [ Среда, 28 Январь, 2009 09:52 ]
Заголовок сообщения:  Re: Большой проект на BlackBox

Нет, с потоками Windows ББ не дружит.

Но два года назад я делал спец. ядро, которое это обеспечивает (Active BlackBox). Оно как бы не поддерживается (потому что не нравится мне идейно, по модели параллелизма), но полностью работоспособно. Поглядите его на OberonCore и пишите мне в личку - всё обсудим :)

Страница 5 из 5 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/