|
|
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Произошло какое-то событие, ну допустим OnButton.Click, и оно выполняется... Если в теле этого события встретится Exit, то выполнение прекращается. Но если, в нём вызывается процедура, и уже в ней встретится Exit, то прекратится исполнение только этой процедуры. А можно ли из процедуры остановить выполнение всего события? Конечно можно делать костыли: можно превратить процедуру в функцию, и в ней перед выходом подавать значение: выполнилась нормально или прекратила работу через Exit, а потом на основания полученного от функции значения делать такой же выход и в блоке вызвавшем функцию. Но это костыли! Возможно тут кто-то возмущённо скажет, что НЕТ, что Именно так и должна работать программа, последовательно и продуманно выполняя каждое действие... Но по такой логике и Exit не должен существовать, а тем более ужасный Halt. Ну или как аналог взять циклы: там есть Continue (так же как Exit прерывающий выполнение блока), но есть и Break - который прекращает выполнение всего цикла (вот аналог такого для прекращения события я и ищу). P.S. Предвижу что кто-то вместо решения задачи, будет говорить о лени, о том что дескать поставить одну проверку, или даже вписать вместо простого вызова процедуры, конструкцию типа: if MyFunction=666 then Exit - это даже красиво... Но эти процедура приводящая к остановке может иметь и десятую степень вложенности, и тогда переделывать процедуры в функции надо будет в десятках мест. Да и где-то может оказаться что остановка произойдёт в функции, а она уже и так что-то возвращает... Тут сразу же появятся люди которые предложат проверять не возвращаемое событие, а специально созданную глобальную переменную. И по всему коду, на всех уровнях вложенности, после выхода из каждой процедуры или функции связанной с этим событием надо будет выставлять проверки выхода (если внутри могла быть изменена эта глобальная переменная). Тут уже кто-то ужаснётся - Что так у тебя за монстр, многоуровневый и остановить которого может потребоваться не в одном каком-то месте, а во многих местах на разных уровнях? Всё просто: Одна кнопка, и она вызывает событие который производит анализ большого массива данных. Расчёты производятся десятками разных методов. У каждого разный метод. Где-то идём рекурсивно, где-то проверяем на возможность ошибок перебором углубляясь вглубь и сравнивая с другими блоками массива, где-то пытаемся вычислить что может произойти и просчитываем дальнейшие решения на базе имеющихся данных, чтобы предугадать события, где-то просто оптимизируем меняя одну последовательно данных на другую... И на разных уровнях вложенности есть возможность отображения на экране (изменение данных, изменение данных, отметка области с ошибками, удаление того что не повлияет ни на что... Всем выводом занимается одна процедура (вызываемая из сотни мест на разных уровнях вложенности процедур и функций). И чтобы сделать пошаговый вывод, достаточно было бы в конце этой функции вызвать какой-то условный GlobalExit (или EventExit), который бы остановил всё действие единственного события. Чтобы оператор проанализировал изменения, и принял решение о продолжении анализа уже с другими параметрами или с другим приоритетом или в другом направлении. Не хочется в случае пошагового режима после каждого вывода данных делать бесконечный цикл (таким образом останавливая работу программы) и Halt'ить её для того чтобы оператор продолжил анализ с другими параметрами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 13:56 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 14:11 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Aniskinraise EEverythingIsOk Обычно используется Abort; Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 14:14 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
InterSkyА можно ли из процедуры остановить выполнение всего события? Можно процедуру объявить функцией и анализировать её результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 14:48 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
wadmanInterSkyА можно ли из процедуры остановить выполнение всего события? Можно процедуру объявить функцией и анализировать её результат. Процедура которую вы предложили объявить функцией и анализировать её результат, сама может быть вызвана из другой функции вызванной из процедуры сработавшей по OnClick. Этот вариант предусмотрительно разобран в вопросе, чтобы заранее избавиться от ответов типа вашего... Aniskin - спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 15:19 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
InterSky, обработка исключительных ситуаций может вам помочь. InterSky... Ну или как аналог взять циклы: там есть Continue (так же как Exit прерывающий выполнение блока), но есть и Break - который прекращает выполнение всего цикла (вот аналог такого для прекращения события я и ищу). Break прерывает цикл, но не прерывает процедуру. Exit - прерывает не только цикл, но и процедуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 15:30 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovОбычно используется Abort; +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 15:35 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
goldmi45InterSky, обработка исключительных ситуаций может вам помочь. InterSky... Ну или как аналог взять циклы: там есть Continue (так же как Exit прерывающий выполнение блока), но есть и Break - который прекращает выполнение всего цикла (вот аналог такого для прекращения события я и ищу). Break прерывает цикл, но не прерывает процедуру. Exit - прерывает не только цикл, но и процедуру. Вы знаете что такое аналогия? Представьте язык программирования, в котором нету циклов (а так же goto и рекурсии). Если вам надо было бы что-то выполнить в цикле от 1 до 5, вы бы писали: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. То есть, цикл - это процедура внутри процедуры. Если вместо комментария вы впишите текст программы и там встретится Exit, он сработает как Continue в циклах и завершит лишь внутреннюю процедуру "innerProc". По аналогии, встречающийся в цикле Break завершил бы внешнюю процедуру "outerProc". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 17:07 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
InterSky, "Выдыхай, бобер" - ©. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 17:22 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
InterSky, авторНо если, в нём вызывается процедура, и уже в ней встретится Exit, то прекратится исполнение только этой процедуры. А можно ли из процедуры остановить выполнение всего события? надежнее и проще всего решается исключениями ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:10 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Есть еще более красивый вариант: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:15 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
rgreatЕсть еще более красивый вариант: If not MyProc then Exit; Я же объяснил что и из функций тоже надо выходить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:25 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
InterSky, Меняйте функцию. funtion myFunc: integer; на funtion myFunc(out Res: integer): boolean; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:29 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Собственно половина winAPI так работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:30 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
InterSkyЯ же объяснил что и из функций тоже надо выходить... Слово "аборт" ты при чтении топика пропустил как "шибка нипанятное"? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:35 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Abort - медленно. Если таких выходов предпологается много - это очень плохое решение. Как-то у меня коллега сделал как-то так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. А потом удивлялся, что это у него все тормозит нещадно на больших объемах данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:40 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
rgreatА потом удивлялся, что это у него все тормозит нещадно на больших объемах данных. Тормозило у него в основном из-за передачи строки по значению скорее всего. SEH, используемый для исключений, считается быстрейшим способом их обработки из всех. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:46 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 11297 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 18:52 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
rgreat11297 0 Ну, у меня разница не так велика, но таки да, второй цикл в 100 раз быстрее первого. Очевидно, туда вмешиваются накладные расходы менеджера памяти. Жаль в Дельфи нельзя выкинуть статический объект исключения. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:07 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, 0.1 секунды на мнеджер памяти не списать. Если бы дело было только в нем то было бы не 100 вызовов в секунду а как минимум 10000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:21 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Упс, 0.01 сек. Опечатался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:22 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
rgreat0.1 секунды на мнеджер памяти не списать. Это у тебя что-то с таймером. Мне пришлось добавить два нуля в цикл чтобы получить 4087 47 Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:23 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Выброс исключения тормозит, да. Там, где предполагается частый отрицательный результат, лучше юзать возврат флага/кода ошибки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:26 |
|
||
|
Как прекратить выполнение события из продцедуры?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЭто у тебя что-то с таймером. Не, реально 11 секунд. Delphi 10.2, Release, Core i5-6500 3.2 GHz. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2019, 19:28 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=62&tid=2039047]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
69ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 372ms |

| 0 / 0 |
