|
Вопрос # 5 120/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
я-новичек.Процедура TForm1.Button1Click(Sender:TObject) запущена из Form1 и долго выполняется(зациклена). Как ее прервать по внешнему событию, например, по клавише ? Такое ощущение, что все процедуры выполняются на запрещенных прерываниях.Прерывание по Timer происходит только при выходе из процедуры в TForm1.
Если это можно сделать, то как вернуться к прерванной процедуре?
Я сделал неэлегантно: запустил второе приложение , использовал общую для двух приложений ячейку общего файла и периодически опрашивал эту ячейку в процедуре.
С уважением ко всем специалистам.
 |
Вопрос задал: 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™ (статус: Доктор наук), 23 марта 2011, 14:43 [#2]:
Цитата (evzovich):
Оценка за ответ: 4
Что, мой ответ тебя неудовлетворил?
Где коммент?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
bugmenot (статус: 3-ий класс), 23 марта 2011, 20:52 [#3]:
Как минимум, флаг нужно проверять в брутальном цикле
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
bugmenot (статус: 3-ий класс), 24 марта 2011, 18:27 [#4]:
while not Aborted do
begin
{ чтотота }
Application.ProcessMessages();
end
А в другом месте этот флаг выставлять, когда приспичит. И да, это всё расписано в третьей, четвёртой или пятой главе _любой_ книжки про дельфи.
PS: Нет - личной переписке! :-P
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|