Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизКак остановить выполнение метода Найти похожие ветки
← →
DK © (2005-01-10 18:10) [0]Здравствуйте! У меня есть такая проблема.
У меня есть длительный по времени метод. Мне нужно его остановить выполнение этого метода из главной формы. Как это сделать? Проверка на флаг не подходит.
Сейчас программа ведет себя так:
-нажали на кнопку выхода;
-останавливаеться метод;
-заходит в обработчик кнопки, отрабатывает весь;
-возвращаеться в остановленный метод и дорабатывает его до конца.
← →
DK © (2005-01-10 18:45) [1]Я сам прочитал свое сообщение и ничего не понял о чем это я писал.
В методе происходит конвертирование данных из одной БД в другую.
Мне нужно из формы его прервать и закрыть приложение.
Я понимаю, что уже вечер:-)
← →
Alexander Panov © (2005-01-10 18:51) [2]DK © (10.01.05 18:10)
Проверка на флаг не подходит.
Почему не подходит?
← →
Kerk © (2005-01-10 18:52) [3]два варианта пока вижу
1. Выполняй в отдельном потоке
2. Пусть при нажатии на кнопку задается значение переменной соответствующее условию выхода их цикла. А в цикле Application.ProcessMessages делай.
← →
DK © (2005-01-10 18:59) [4]//Почему не подходит?
Потому что остановка конвертирования не планировалась изначально.
И чтоб ее реализовать нужно ее добавлять ну в очень многих местах(где-то так 200 мест :-)).
Да программа будет супер медленной (сейчас пока медленная:-)).//
← →
DK © (2005-01-10 20:07) [5]Кто-то знает как прервать работу процедуры. Без проверки флагов внутри ее.
← →
Kerk © (2005-01-10 20:10) [6]DK © (10.01.05 20:07) [5]
читать умеешь?
Kerk © (10.01.05 18:52) [3]
1. Выполняй в отдельном потоке
← →
DK © (2005-01-10 20:12) [7]Я смогу прервать поток? Если да то подскажи как.
← →
begin...end © (2005-01-10 20:13) [8]> [7] DK © (10.01.05 20:12)
TThread.Suspend
← →
DK © (2005-01-11 11:09) [9]TThread.Suspend//
Эта команда приостановит поток. Но мне нужно его прервать, да так чтоб память очистилась. А выполняющаяся внутри его транзакция сделала откат.
← →
TUser © (2005-01-11 11:16) [10]
> TThread.Suspend//
> Эта команда приостановит поток. Но мне нужно его прервать,
> да так чтоб память очистилась. А выполняющаяся внутри его
> транзакция сделала откат.
TThread.Terminate, а Экзекьют оформить так
while (not Terminated) and {not end of work} do
{single step}
if {not end of work} then
{rollover}
← →
KSergey © (2005-01-11 11:30) [11]> [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 мест?
А завершить корректно какую-либо процедуру извне без ее собственного желания (а это желание как раз в проверке флага или иного сигнала извне и заключается) - невозможно, хоть завыносись ее в поток.
Елинственное - поток можн огрубо прибить, но это не есть корректное его завершение с "да так чтоб память очистилась".
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c