| 
| 
 | Вопрос # 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сця, де призупинилося.
 
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |