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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 5 120

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

Доброго времени суток, уважаемые эксперты!
я-новичек.Процедура TForm1.Button1Click(Sender:TObject) запущена из Form1 и долго выполняется(зациклена). Как ее прервать по внешнему событию, например, по клавише ? Такое ощущение, что все процедуры выполняются на запрещенных прерываниях.Прерывание по Timer происходит только при выходе из процедуры в TForm1.
Если это можно сделать, то как вернуться к прерванной процедуре?
Я сделал неэлегантно: запустил второе приложение , использовал общую для двух приложений ячейку общего файла и периодически опрашивал эту ячейку в процедуре.
С уважением ко всем специалистам.

evzovich Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: evzovich (статус: Посетитель)
Вопрос отправлен: 23 марта 2011, 12:02
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Можно (НУЖНО) такие вещи выносить в отдельный тред (TThread). В инете и книжках туева хуча примеров для начинающих. Вот тебе книжка, скачай её. И смело лезь в раздел "Глава 11. Создание многопоточных приложений". Там всё разжёвано и с примерами.
Есть, конечно, ещё способ со вставлением в тело цикла вызова Application.ProcessMessages, но это сильно увеличивает время выполнения этого самого цикла. Можно использовать только в специфических случаях, поэтому, в общем случае, не рекомендую.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 23 марта 2011, 12:11
Оценка за ответ: 4


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

Всего сообщений: 4; последнее сообщение — 24 марта 2011, 18:27; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 23 марта 2011, 13:30 [#1]:

нет тут прерываний, нет!
В общем случае все обработчики событий у компонентов должны быть как можно короче. Если нужно делать долгую обработку, то либо треды, либо отдельное приложение.

Хотя могут быть и другие решения, если знать, что именно делает зацикленный код.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 23 марта 2011, 14:43 [#2]:

Цитата (evzovich):

Оценка за ответ: 4

Что, мой ответ тебя неудовлетворил?
Где коммент?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

bugmenot (статус: 3-ий класс), 23 марта 2011, 20:52 [#3]:

Как минимум, флаг нужно проверять в брутальном цикле
виконання програми розпочинається з того самого мiсця, де призупинилося.

bugmenot

bugmenot (статус: 3-ий класс), 24 марта 2011, 18:27 [#4]:

while not Aborted do 
begin
  { чтотота }
  Application.ProcessMessages();
end

А в другом месте этот флаг выставлять, когда приспичит. И да, это всё расписано в третьей, четвёртой или пятой главе _любой_ книжки про дельфи.

PS: Нет - личной переписке! :­-­P
виконання програми розпочинається з того самого мiсця, де призупинилося.

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

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