Где в классах счётчик оборотов?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Где в классах счётчик оборотов?

Сообщение Сквозняк » 01.12.2020 12:49:46

При построении сложных программ, при обращении к работающему циклу часто требуется считать его обороты. Например, послал ему данные, цикл их схавал, сгенерировал событие Х и номер своего оборота, допустим 1 относительно события, хотя можно и с начала работы цикла генерировать, но там будут большие числа и их иногда придётся обнулять и считать сначала. Какой-то из циклов обнаружил событие Х и начинает считать обороты сгенерировавшего цикла, когда их число достигает нужного, он знает, что данные обработаны и усвоены циклом и можно генерировать следующее событие. Так сложная логика работает на обычном паскале с goto, хорошо работает - ничего не сыпется от того, что события поступают рано.

А в классах такого ништяка нету! В тех что сам создаёшь, можно конечно извратиться и прилепить процесс, который будет крутить счётчик. Вот только для чужих классов придётся влезать в чужие исходники, если они есть, и присобачивать дополнительное поле, изменяться которое будет с неизвестной частотой относительно других полей - здравствуй неопределённость и глюки. За примером лажи с неопределённостью текущего состояния класса далеко ходить не надо - дочерняя форма неизвестно когда готова автоматически грузить данные и при этом не сломать стек. А был бы у неё счётчик оборотов, можно было бы в формкреате повесить активацию будильника, который считал состояние счётчика оборотов формы и через несколько его оборотов, когда форма гарантированно прогрузится, стал грузить в форму данные без риска сломать стек. Но в дельфях такой очевидный функционал сделать не додумались, а раз там нету, то и в fpc добавлять не станут, хотя перенос кода из дельфей в лазарус это не поломает, а вот при переносе из лазаруса в дельфи, тамошние обитатели ощутят неполноценность системы.
Сквозняк
энтузиаст
 
Сообщения: 868
Зарегистрирован: 29.06.2006 22:08:32

Re: Где в классах счётчик оборотов?

Сообщение Снег Север » 01.12.2020 13:00:23

Я работал в делфи с программами в десятки тысяч строк с полусотней форм, но никогда с подобной необходимостью не сталкивался. И так и не понял, какой в этом может быть смысл.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2735
Зарегистрирован: 27.11.2007 16:14:47

Re: Где в классах счётчик оборотов?

Сообщение Сквозняк » 01.12.2020 13:34:53

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

Добавлено спустя 15 минут 38 секунд:
Счётчик оборотов цикла/класса, это как дата рождения в паспорте у людей - по ней смотрят когда в школу отправлять, во взрослую тюрьму сажать, в армию брать, пенсию давать/не давать и т.д.
Сквозняк
энтузиаст
 
Сообщения: 868
Зарегистрирован: 29.06.2006 22:08:32

Re: Где в классах счётчик оборотов?

Сообщение Seenkao » 01.12.2020 14:03:14

Сквозняк, хорош совсем-то гнать на ООП. Не ООП здесь виновато. Умные люди придумали его, чтоб упростить разработку. Только они не догадывались через какое место это используют.

А для каждого класса (объекта класса), тебе придётся самому приписывать счётчик и временной интервал. Но вот как ты ограничишь его по времени срабатывания... опять же только внутри самого класса (объекта класса)?...
Seenkao
постоялец
 
Сообщения: 246
Зарегистрирован: 01.04.2020 03:37:12

Re: Где в классах счётчик оборотов?

Сообщение zub » 01.12.2020 14:30:18

янхнп
Зачем это в каждом классе?
Или делай свои классы с "фичей", или храни сам в отдельной структуре (например TMap<TObject,TYourData>) если нужно привязаться к чужим классам
zub
долгожитель
 
Сообщения: 2677
Зарегистрирован: 14.11.2005 23:51:26

Re: Где в классах счётчик оборотов?

Сообщение MysticCoder » 01.12.2020 14:33:41

Если очень сильно хочешь, то можешь извратиться и перехватить конструктор и деструктор TObject слайсингом, в своем хуке вести учёт в каком нибудь отдельном массиве всех созданных TObject с временем когда они были созданы. Ну и когда надо из этого массива смотришь когда и что было создано.
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Где в классах счётчик оборотов?

Сообщение Сквозняк » 01.12.2020 14:52:03

Seenkao писал(а):квозняк, хорош совсем-то гнать на ООП. Не ООП здесь виновато. Умные люди придумали его, чтоб упростить разработку. Только они не догадывались через какое место это используют.


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

Seenkao писал(а):А для каждого класса (объекта класса), тебе придётся самому приписывать счётчик и временной интервал. Но вот как ты ограничишь его по времени срабатывания... опять же только внутри самого класса (объекта класса)?...


Никакого временного интервала не нужно. Когда делал тоже самое в процедурах, он был не нужен, только циферки срабатывания обработки определённых событий, например так:
Код: Выделить всё
1:
sobytie_cikla:=globaljnyi_scjotcik_X;

if predyduscee_sobytie_cikla=700 then
  if predyduscee_sobytie_cikla=sobytie_cikla then
    if predyduscij_globaljnyi_scjotcik_X>=700
      then begin
//globaljnyi_scjotcik_X=700 успел усвоиться сгенерировавшим его потоком, значит можно с ним работать
...............................
     end;

if sobytie_cikla=800 then ............................

if X=Y then goto 100;
predyduscee_sobytie_cikla:=sobytie_cikla;
goto 1;

100:
.................. //всякая всячина, которую может понадобиться прописать при выходе
end;

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

Для счётчика можно выделить переменную типа int64, а в считывателях значения счётчика прописать обработку ситуации когда этот счётчик пойдёт по новому кругу, то есть когда текущее значение счётчика будет меньше предыдущего.

Добавлено спустя 4 минуты 46 секунд:
zub писал(а):янхнп
Зачем это в каждом классе?


Чтобы можно было в случае необходимости прописать подчинение класса надмозгу. В принципе, в классах эту фичу можно делать неактивной, при этом значение счётчика =-1. Если там отрицательна величина, то надмозг даёт задание классу считать обороты и класс сразу делает это число положительным..
Сквозняк
энтузиаст
 
Сообщения: 868
Зарегистрирован: 29.06.2006 22:08:32

Re: Где в классах счётчик оборотов?

Сообщение Снег Север » 01.12.2020 15:02:32

Вижу какую-то фичу, которая понадобится в одной программе на много тысяч. Топикстартеру никто не мешает соорудить свою библиотеку классов с этой фичей, но пихать её в стандарт - бессмыслица.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2735
Зарегистрирован: 27.11.2007 16:14:47

Re: Где в классах счётчик оборотов?

Сообщение Seenkao » 01.12.2020 15:07:28

Сквозняк писал(а):То есть нужны только цифры, по которым можно проследить что нужный цикл/класс всеми своими активными полями усвоил событие, временной интервал не нужен. На усвоение одних событий можно выделить один оборот, на усвоение других - 2,3 или больше. А если только по системному таймеру считать, то может баг случиться, если ОС программу или поток затормозит на несколько секунд. Там иногда случаются подвисания чего-то. Системный таймер можно использовать как вспомогательное средство, он не гарантирует что программа в это время выполнила что надо.

Каждый смотрит со своей "колокольни". ))) Я смотрю с той точки зрения, когда процессом владею полностью я. Но во многих случаях я могу быть не прав! В данном случае (вероятно) я буду прав в той ситуации, когда я буду оперировать программой, как системой, точнее ни каких других процессов выше просто не может быть.
И в этом случае, интервалы надо использовать.
Когда какая-то программа выше создаваемой, то тут всё зависит от разработчика.

Добавлено спустя 58 секунд:
Снег Север, что-то не нравится, проходи мимо.
Seenkao
постоялец
 
Сообщения: 246
Зарегистрирован: 01.04.2020 03:37:12

Re: Где в классах счётчик оборотов?

Сообщение Сквозняк » 01.12.2020 15:11:06

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


:mrgreen: Фича классов именно в том, чтобы использовать чужие классы и тупо кидать их, как говно вилами из кучи в телегу, на форму без лишнего траха. А если всё придётся взламывать в каждой версии обновления продукта, то сам продукт уменьшает свою ценность.
Сквозняк
энтузиаст
 
Сообщения: 868
Зарегистрирован: 29.06.2006 22:08:32

Re: Где в классах счётчик оборотов?

Сообщение Снег Север » 01.12.2020 15:18:24

Seenkao писал(а):Снег Север, что-то не нравится, проходи мимо.

"Не говори, что мне делать и не скажу, куда идти тебе!" (С)
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2735
Зарегистрирован: 27.11.2007 16:14:47

Re: Где в классах счётчик оборотов?

Сообщение Сквозняк » 01.12.2020 15:21:34

Seenkao писал(а):Я смотрю с той точки зрения, когда процессом владею полностью я. Но во многих случаях я могу быть не прав! В данном случае (вероятно) я буду прав в той ситуации, когда я буду оперировать программой, как системой, точнее ни каких других процессов выше просто не может быть.
И в этом случае, интервалы надо использовать.
Когда какая-то программа выше создаваемой, то тут всё зависит от разработчика.


То есть ты предлагаешь другой тип счётчика, программируемый на время. Ну так на здоровье, если это будет вторым счётчиком, не влияющим на первый. В лазарусе есть два типа будильника, чем один отличается от другого, я так нигде внятно не прочитал, очевидно что его дополнительные фичи пока не понадобились тем, кто мог написать про него в тырнетовских пособиях. Тоже самое и со счётчиками, понадобится ли счётчик с привязкой к какому-то таймеру (системному или тому что программа высчитывать будет), это решится при использовании. Пока что я предпочитаю считать время в другом месте и знаю про такой вариант.
Сквозняк
энтузиаст
 
Сообщения: 868
Зарегистрирован: 29.06.2006 22:08:32

Re: Где в классах счётчик оборотов?

Сообщение Seenkao » 01.12.2020 15:22:34

Я не осуждаю, в отличии от некоторых, действия других.
Человек живёт своей жизнью и думает своей головой. А ни как те твоей, Снег Север.

Добавлено спустя 3 минуты 33 секунды:
Сквозняк, я больше за их совместное использование, по надобности. :)
Seenkao
постоялец
 
Сообщения: 246
Зарегистрирован: 01.04.2020 03:37:12

Re: Где в классах счётчик оборотов?

Сообщение Сквозняк » 01.12.2020 16:38:42

В живых организмах аналог счётчикам циклов, это нервные импульсы - органы, мышцы, мозг шлют их в фоновом режиме и все кому надо могут считать их и сделать какие-то выводы. Если в классах в доступных полях сделать такие счётчики, то программа с ними приобретает нервную систему, по которой одна часть программы сможет в любой момент получить представление об активности другой, сделать на основе этого выводы и скоректировать свою работу. И это без всяких нейросетей, только доступ к чтению состояния переменных счётчиков и возможность запустить счёт нужно сделать максимально доступными.
Сквозняк
энтузиаст
 
Сообщения: 868
Зарегистрирован: 29.06.2006 22:08:32

Re: Где в классах счётчик оборотов?

Сообщение iskander » 01.12.2020 16:41:43

Просьба к модераторам убрать это во флуд.
iskander
постоялец
 
Сообщения: 404
Зарегистрирован: 08.01.2012 18:43:34

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

Рейтинг@Mail.ru