|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
21.12.2015, 14:50 | #1 |
Пользователь
Регистрация: 13.05.2007
Сообщений: 60
|
Собственный стек процедур или выход посреди процедуры
Здравствуйте, господа. Структура моей программы такова, что имеется набор процедур (я их называю события), в которых выполняются определенные действия - расчеты, вывод результатов, нажатие кнопок, вызов других событий и проч. Короче все что угодно. Программа состоит из вызова событий. Такая структура задана изначально и изменению не подлежит. Смысл весь в том, что одно событие должно размещаться в одной процедуре.
Допустим есть событие, которое реализует следующую последовательность действий: - Вывод начальной информации - Нажатие кнопки на форме, которая задает переменную Q - Если Q=1, то вызов другого события и после его выполнения возврат в это событие - Если Q=0, то дальше - Нажатие другой кнопки на форме. - Вывод чего-нибудь - выход Т.е. фактически процедура должна прерываться (в середине процедуры происходить выход из нее (чтобы сделать какие-то действия на форме, например, нажать кнопку), а затем снова возвращаться в процедуру с того места, где было прерывание. Я реализовал данную схему следующим образом. Сделал собственный стек, в который я добавляю вызываемые события, точку в самом событии и какие-нибудь данные: Код:
Код:
Код:
Код:
Код:
Код:
Наверное это извращенный метод, но другого ничего придумать не смог. В принципе я сделал что-то наподобие обычного ассемблерного стека (когда-то давно на древнем компе (не IBM PC даже) я что-то писал на ассемблере). Может можно как-то это все сделать по-другому, проще или хотя бы избавиться от таймера. Может даже можно на ассемблере? (Знания ассемблера у меня меньше минимальных) |
23.12.2015, 15:36 | #2 |
Пользователь
Регистрация: 13.05.2007
Сообщений: 60
|
Ответов нет... Интересно, это невозможно сделать или просто никто не знает?..
|
23.12.2015, 16:03 | #3 |
Участник клуба
Регистрация: 09.11.2007
Сообщений: 1,762
|
А зачем не реализовать это с помощью обычных процедур и функций?
|
23.12.2015, 19:06 | #4 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Подозреваю, то попытка изобрести собственный интерпретатор, пока что он программный и без переменных и функций и прочего.
Чтобы передать управление другому потому т.е. визуальному, первый надо либо на паузу поставить: поток1: команда команда вызов виз. интерфейса ва потоке 2: пауза потоку 1 команда конец виз. интервейса возобновление потока1 смерть потоку 2 команда команда .... либо залочить его в какой-то бесконечный loop пока работает интерфейс, поток1: это вызов виз. интерфейса? - нет команда это вызов виз. интерфейса? - нет команда это вызов виз. интерфейса? - да пока не выпал из него если выпал на выход иначе команда в интерфейсе ; это вызов виз. интерфейса? - нет команда это вызов виз. интерфейса? - нет команда ... и не понятно что вы там за затею удумали. Последний раз редактировалось Человек_Борща; 23.12.2015 в 19:08. |
23.12.2015, 19:20 | #5 |
Подтвердите свой е-майл
Регистрация: 12.11.2014
Сообщений: 470
|
Нда. Интерпретатор процедурного языка без переменных - это очень круто. А чего бы не пойти с того конца, откуда все делают? То есть сначала переменные, а потом уже развитие от алгоритмического к процедурному.
|
23.12.2015, 19:46 | #6 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Цитата:
Я предположил что это интерпретатор, т.к. кое-где с, как мне кажется, похожим работаю. |
|
23.12.2015, 20:08 | #7 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Ай да улыбатель ))) Яб плюсанул
I'm learning to live...
|
|
23.12.2015, 21:13 | #8 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
fanlis
Лично я не понял к вопроса. Просто начали об одном, а спрашиваете про другое. Бывает так, что хочется: - менять граф переходов; - управлять очерёдность исполнения функций; - контролировать стек; - контролировать локальные переменные и т.п. Я это называю иерархической парадигмой программирования. В самом Delphi такое не предусмотрено. Для этого нужен интерпретируемый язык программирования. 1. Отсюда первое решение делать интерпретатор. 2. Второе решение разбить программу на процедуры с единообразным набором параметров и запретить внутренние вызовы себе подобных. 3. Использовать ассемблер для навешивания крюков(Hook). Наложения заплаток и изменения кода как говориться на лету. 4. Использовать отладчик для остановки посреди команд. Можно написать отладчик который будет отлаживать сам себя. Всё остальное это пожалуй комбинации подходов. ---------------------------------------------------- Цитата:
Что касается получить доступ так вам никто не запрещает. А если вам надо ещё реагировать на действия пользователя. Так отделите свой код от формы. К примеру сделайте его параллельным.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 23.12.2015 в 21:18. |
|
24.12.2015, 00:43 | #9 | |
ПШП
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,894
|
Цитата:
В очередной раз задан только конкретный вопрос, но не озвучена сама задача. Последний раз редактировалось BDA; 24.12.2015 в 03:31. |
|
25.12.2015, 08:55 | #10 | |
Пользователь
Регистрация: 13.05.2007
Сообщений: 60
|
Цитата:
Ну да ладно, я отвлекся. Просто передо мной поставлена жесткая задача: имеющееся событие реализовывать в одной процедуре. Таких событий... ну на данный момент штук 500, у каждого есть свой номер. И каждое событие должно быть оформлено как одна процедура, как единый блок, чтобы не было путаницы. Такая задача. Будут у нее параметры или нет - не важно, главное чтобы все процедуры были одного типа (все без переменных, или все с двумя переменными и т.д.). Но так получается, что событие предусматривает работу с интерфейсом программы, т.е. должно прерывать свою работу, чтобы получить данные от пользователя (например, нажатие кнопки). Я поэтому и выбрал такой метод - прерывание процедуры и возврат в нее. Да, получается наверно что-то вроде интерпретатора (хотя я не знаю, что это такое, только догадываюсь). Ну а как еще это сделать? Разбивать одну процедуру на несколько не очень хорошо: - будет очень много процедур, порой даже с одной командой; - целиковое событие размазывается по программе, что ведет к путанице; - не понятно какую процедуру вызывать после того, как закончилась первая (требующая нажатия кнопки), и пользователь нажал кнопку (т.к. допустим эта кнопка используется во многих событиях). - ну и требование делать все в одной процедуре (хотя конечно это можно оспорить и доказать невозможность такого подхода, но неизвестно к чему это приведет). Был у меня еще один мысль (как предлагалось здесь): программа просит нажать кнопку и переходит в бесконечный цикл с Application.ProcessMessages, который ждет нажатия. Но это ведь занимает процессор, а это плохо. А таймер мне не нравится тем, что как показала практика, переходов между частями события может быть много и между самими событиями и ощутимы задержки в программе. А какую поставить задержку на таймере тоже не понятно (вдруг на моем компе она успеет отработать, а на другом, допустим более медленном или быстром, нет?). У меня была задумка работать со стеком (не с моим, а с обычным), как-то добавлять самому туда адреса процедур или что-то подменять, но я это не умею делать. Для начала я бы попытался решить поставленную задачу, т.е. прерывать работу процедуры и возвращаться в нее. И сделать то же, что я уже сделал, но с обычным стеком (просто не знаю как), поэтому и спросил конкретно. Если не получится, тогда поменять метод, не через стек, а как-то еще. Ну а если уж и это никак, тогда придется как-то менять весь подход и доказывать, что поставленная задача нерешаема (что не хотелось бы). |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Refresh() формы, или собственный MessageBox | timao | C++ Builder | 2 | 29.11.2013 17:56 |
Выход из главной процедуры | VictorM | Microsoft Office Excel | 6 | 26.11.2012 11:52 |
Принудительный выход из процедуры | kardinal94 | Общие вопросы Delphi | 8 | 12.07.2011 03:55 |
Выход из процедуры | mactepmac | Общие вопросы Delphi | 1 | 28.06.2011 06:56 |
Не работает выход во внешнию среду из процедуры!!! | Hacker19_90 | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 10.11.2008 19:31 |