В процессе написания векторного редактора столкнулся с необходимостью отслеживания момента, когда мышка начала и перестала двигаться, тогда я это решил ChangeMon и флагом на дискретных элементах (пришлось серьёзно потанцевать с бубном).
Сегодня miver опубликовал забавную схему дробления строки на группы символов, разделённые пробелом, в которой используется тот же ChangeMon. и опять такая же задача - узнать, что больше изменений не происходит. Он этот вопрос не решал, т.к. задачей была минимальная схема, а это её серьёзно раздувает и замедляет.
Это была преамбула, теперь - амбула.
Если хотим в этих и подобных случаях получить универсальное, гениальное и простое решение - слёзно просим кого-нибудь с доступом к SVN добавить две строчки в условный переход кода ChangeMon и оформить ещё одно событие - событие неизменности данных. Собственно, вот и вся необходимая и достаточная доработка. Сразу станет возможным делать ветвление - действие при изменении и действие при неизменности.
Спектр применения очень широк, иногда бывает очень полезно реагировать на приостановление каких-либо изменений, а не только на их началопродолжение.
Если продолжить мысль, добавив триггер получаем детектор "заднего фронта" изменений - реакцию на прекращение изменений. Тоже полезный режим)
Этот топик читают: Гость
Ответов: 3889
Рейтинг: 362
|
|||
карма: 1 |
|
Ответов: 4641
Рейтинг: 334
|
|||
1nd1g0 писал(а): иногда бывает очень полезно реагировать на приостановление каких-либо измененийа это случаем не логическое сравнение на равенство? |
|||
карма: 1 |
|
Ответов: 3889
Рейтинг: 362
|
|||
Ravilr, ключевое слово - приостановление. Регистрируем начало изменений и регистрируем конец изменений, а период затишья после (полное отсутствие изменений) - игнорируем. Тут-то и всплывает ChangeMon, имеющий такую удобную функцию определения начала изменений (начался приём данных, например, координат мыши при движении, изменение положения регулятора на панели, появился и держится установленный бит в порту, загрузки текста в элемент браузера - у него нет нормального контроля завершения загрузки и т.п.). А вот функции определения конца изменений иили неизменности данных, увы - нет. Была бы, - можно было бы одним компонентом обходиться. А пока приходится сбрасывать какой-нибудь флаг, потом его при начале изменения потока, делать проверку отдельным куском схемы, установлен ли флаг, если нет - отслеживать, давно ли он сброшен - если только что - одно действие, если давно - другое.
Вот чтобы немного меньше суеты было я и поднял эту тему. |
|||
карма: 1 |
|
Ответов: 4641
Рейтинг: 334
|
|||
карма: 1 |
| ||
файлы: 1 | code_24814.txt [928B] [433] |
Ответов: 3889
Рейтинг: 362
|
|||
Ravilr, я на пальцах выше дописал)
|
|||
карма: 1 |
|
Ответов: 4641
Рейтинг: 334
|
|||
все равно ничего не понял. Ты хочешь контролировать неизменность данных или выдавать событие при не изменении данных? Т.е грубо говоря по таймеру или по поступлению данных в потоке?
|
|||
карма: 1 |
|
Ответов: 67
Рейтинг: 5
|
|||
карма: 1 |
|
Ответов: 3889
Рейтинг: 362
|
|||
Ravilr, Та точка, что легче всего добавляема в ChangeMon, срабатывает при любой неизменности данных.
Я же просто привёл в пример ещё более сложную задачу, где мне надо было чётко и однократно среагировать на прекращение изменений - когда мышка останавливалась, перерисовывался экран, но перерисовывать (пока мышка стоит на месте) регулярно его по таймеру опроса мышки было бы расточительно, потому пришлось реализовывать механизм с флагом. Если данные посерьёзнее мышиных координат, то монитор изменений уже значительно быстрее, чем самодельная логика. И там уже всё есть - осталось только ветку с Else после ветки с Then приписать) Ну а триггер, однократно срабатывающий только в момент остановки изменений в компоненте реализовать - это сверх ожиданий, хотя совсем не трудно. При работе с процессами реального времени крайне полезная штука, когда нужно переждать активность третьей стороны. |
|||
карма: 1 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
1nd1g0 писал(а): И там уже всё есть - осталось только ветку с Else после ветки с Then приписать |
|||
карма: 25 |
|
Ответов: 3889
Рейтинг: 362
|
|||
Tad, коды уже выложили до меня (10755), судя по всему, в апреле этого года уже кому-то аналогичная идея приходила в голову.
|
|||
карма: 1 |
|
Ответов: 3349
Рейтинг: 233
|
|||
1nd1g0, Что то уж правда ты загнул. Это делается 2 элементами
code_24815.txt ------------ Дoбавленo в 21.39: 1nd1g0, Что то уж правда ты загнул. Это делается 2 элементами
|
|||
карма: 1 |
| ||
файлы: 1 | code_24815.txt [588B] [333] |
Ответов: 3889
Рейтинг: 362
|
|||
Ivann, да нет, всё логично, зачем увеличивать и замедлять схему, если можно доделать уже имеющийся компонент, раз уж он всё равно есть. Если он такой не нужный, то можно таки добавить функцию триггера отслеживания прекращения изменений, и тогда он станет незаменимым в алгоритмах реакции на внешние факторы.
|
|||
карма: 1 |
|
Главный модератор
Ответов: 2999
Рейтинг: 396
|
|||
1nd1g0, кто мешает сделать самому Ex версию компонента, выложить на форуме и если сообщество одобрит, то поместить на SVN?
|
|||
карма: 6 |
|
Ответов: 3889
Рейтинг: 362
|
|||
Nic, по прошлому опыту знаю, что всё равно потом всё переписывают гуру, а тут вообще буквально две-три строчки и одна строчка в ini. Да ещё и кто-то это уже делал, как оказалось. Получается, я лишь поддерживаю чужую идею, не претендуя на авторство. А триггер для определения переходного процесса можно и снаружи привесить, но для его работы тоже требуется событие равенства данных, которого у нас пока нет.
|
|||
карма: 1 |
|
Ответов: 8926
Рейтинг: 823
|
|||
1nd1g0, на рассыпухе (если хватит терпения собрать )
------------ Дoбавленo в 14.41:
------------ Дoбавленo в 14.54:
Нет, не получится ------------ Дoбавленo в 14.57: Интернет и форум МАТЬ-ПЕРЕМАТЬ! |
|||
карма: 19 |
|