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