Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как остановить выполнение метода


DK ©   (2005-01-10 18:10:00) 

Здравствуйте! У меня есть такая проблема.
У меня есть длительный по времени метод. Мне нужно его остановить выполнение этого метода из главной формы. Как это сделать? Проверка на флаг не подходит.
Сейчас программа ведет себя так:
 -нажали на кнопку выхода;
 -останавливаеться метод;
 -заходит в обработчик кнопки, отрабатывает весь;
 -возвращаеться в остановленный метод и дорабатывает его до конца.


KSergey   (2005-01-11 11:30:00) [1]

> [10] TUser ©   (11.01.05 11:16)
> TThread.Terminate, а Экзекьют оформить так
>
> while (not Terminated) and {not end of work} do
>  {single step}

Это издевательство?? Он же пишет упорно: "Проверка на флаг не подходит."
А вы предлагаете проверять флаг Terminated :)

> [4] DK ©   (10.01.05 18:59)
> И чтоб ее реализовать нужно ее добавлять ну в очень многих
> местах(где-то так 200 мест :-)).

Скажу грубо: это ваши проблемы.
Перепишите так, чтобы это место было одно. Тем более раз конвертирование - скорее всего обрабоотка по записям - вот и проверять после каждой записи, где тут 200 мест?
А завершить корректно какую-либо процедуру извне без ее собственного желания (а это желание как раз в проверке флага или иного сигнала извне и заключается) - невозможно, хоть завыносись ее в поток.
Елинственное - поток можн огрубо прибить, но это не есть корректное его завершение с "да так чтоб память очистилась".


TUser   (2005-01-11 11:16:00) [2]


> TThread.Suspend//
> Эта команда приостановит поток. Но мне нужно его прервать,
> да так чтоб память очистилась. А выполняющаяся внутри его
> транзакция сделала откат.

TThread.Terminate, а Экзекьют оформить так

while (not Terminated) and {not end of work} do
 {single step}

if {not end of work} then
 {rollover}


DK   (2005-01-11 11:09:00) [3]

TThread.Suspend//
Эта команда приостановит поток. Но мне нужно его прервать, да так чтоб память очистилась. А выполняющаяся внутри его транзакция сделала откат.


begin...end   (2005-01-10 20:13:00) [4]

> [7] DK ©   (10.01.05 20:12)

TThread.Suspend


DK   (2005-01-10 20:12:00) [5]

Я смогу прервать поток? Если да то подскажи как.


Kerk   (2005-01-10 20:10:00) [6]

DK ©   (10.01.05 20:07) [5]
читать умеешь?
Kerk ©   (10.01.05 18:52) [3]
1. Выполняй в отдельном потоке


DK   (2005-01-10 20:07:00) [7]

Кто-то знает как прервать работу процедуры. Без проверки флагов внутри ее.


DK   (2005-01-10 18:59:00) [8]

//Почему не подходит?
Потому что остановка конвертирования не планировалась изначально.
И чтоб ее реализовать нужно ее добавлять ну в очень многих местах(где-то так 200 мест :-)).
Да программа будет супер медленной (сейчас пока  медленная:-)).//


Kerk   (2005-01-10 18:52:00) [9]

два варианта пока вижу
1. Выполняй в отдельном потоке
2. Пусть при нажатии на кнопку задается значение переменной соответствующее условию выхода их цикла. А в цикле Application.ProcessMessages делай.


Alexander Panov   (2005-01-10 18:51:00) [10]

DK ©   (10.01.05 18:10)
Проверка на флаг не подходит.


Почему не подходит?


DK   (2005-01-10 18:45:00) [11]

Я сам прочитал свое сообщение и ничего не понял о чем это я писал.
В методе происходит конвертирование данных из одной БД в другую.
Мне нужно из формы его прервать и закрыть приложение.
Я понимаю, что уже вечер:-)


Наверх

Титульная страница Поиск, карта сайта Написать письмо