Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 256

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Допустим, что при нажатии на Button1 запускается некий долгий цикл, который выполняется довольно долго. Как можно в любой момент времени его прервать, остановить?
С уважением, Сергей Анатольевич!

Полушин Сергей Анатольевич Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель)
Вопрос отправлен: 6 января 2008, 23:23
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Полушин Сергей Анатольевич!
Можно долго говорить о том, что можно с помощью Application.ProcessMessage; добиться уменьшения "подвисания" приложения, но есть два "нормальных способа" решить поставленную задачу. первый - это потоки. о примере использования можно почитать в моей статье на этом сайте.
Теперь, что бы остановить выполнение надо просто вызывать имяпотока.terminate; только не надейдесь, что поток сразу и завершиться. На самом деле поток должен время от времени проверять переменную Terminated. И как только она стала True - поток должен завершить свои дела и выйти с процедуры execute.
Также появиться возможность поставить на паузу (методом имяпотока.suspend) или запустить снова (имяпотока.resume). Также можно выставлять приоритеты (что бы работал потихоньку себе:) ).

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

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 6 января 2008, 23:41


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 6 января 2008, 23:51; участников в обсуждении: 1.
Полушин Сергей Анатольевич

Полушин Сергей Анатольевич (статус: Посетитель), 6 января 2008, 23:48 [#1]:

суть понял.
Но тогда такой вопрос:
если комп во время этого цикла вообще не реагирует ни на что, как бы зависает на время выполнения этого цикла, тогда как вызвать процедуру имяпотока.terninate?
Полушин Сергей Анатольевич

Полушин Сергей Анатольевич (статус: Посетитель), 6 января 2008, 23:51 [#2]:

просто делал в проекте другие процедуры, например, нажатие клавиши Escape. Если нажать на кнопку во время этого "зависания" то код процедуры от нажатия этой кнопки выполняется тока после завершения цикла

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:31
Выполнено за 0.02 сек.