![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| кварк |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 2.8.2002 Репутация: нет Всего: нет |
Поток выполняет некоторые действия.
Как лучше организовать откат? У меня сейчас так: Execute begin phase 1 if not terminated then phase 2 if not terminated then phase 3 . . . if not terminated then phase n if terminated then откат с последней выполненой фазы end Может, есть способы лучше, проще и элегантней? P.S. Вопрос задан, чтобы узнать "как люди делают". - Хочется ведь делать грамотно |
|||
|
||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: нет Всего: 1 |
А у вас это работает? По-моему не должно.
Пример использования с-ва Terminated: phase1; while not Terminated do begin phase2; .... phaseN; end; Команда Terminate устанавливает флаг Terminated в true и немедленно прерывает поток, другими словами код типа: ...... if terminated then dosomething(...); ...... вообще не выполнится. Для того чтобы выполнить какие-то действия в момент остановки потока, нужно использовать его событие OnTerminate. Причем оно вызывается и на команду Terminate (в этом случае поток все равно прерывается), и на doTerminate - метод объекта TThread (в этом случае событие OnTerminate вызывается, но поток не прерывается.) Следовательно, для того чтобы отловить момент завершения потока, нужно передавать какой-нибудь флаг в руки... |
|||
|
||||
| кварк |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 2.8.2002 Репутация: нет Всего: нет |
Вроде, работает.
У меня теперь, правда, несколько по другому: try phase 1 if not terminated then phase 2 if not terminated then phase 3 . . . if not terminated then phase n finally if terminated then откат с последней выполненой фазы end А потом, как я понял из Delphi help, TThread.Terminate ставит свойство Terminated в true, а не завершает поток немедленно. На практике, вроде, тоже самое. |
|||
|
||||
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: нет Всего: 1 |
Да, на счет "немедленно" - я погорячился. Terminate устанавливает св-во Terminated в True, которое показывает что поток будет прерван ТАК СКОРО НА СКОЛЬКО ЭТО ВОЗМОЖНО. В API по-другому, там поток завершается именно "немедленно ". Даже не знаю, что удобнее |
|||
|
||||
| Fantasist |
|
||||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Ну показывает это чисто условно. Скорее это предложение потоку завершиться, а так, как ты сам контролируешь Execute, то завершиться он или нет решать тебе.
Так в API и классов нет. А делфийский TThread - это обертка над API, так что как только ты выйдешь из своего Execute, поток "немедленно" завершится. Почти. Он еще выполнит еще эти строчки:
В тот момент, как функция EndThread вернет значение, поток только что был завершен. Но все эти строчки выполняться уже после твоего кода. -------------------- Волны гасят ветер... |
||||||
|
|||||||
| Le Taon |
|
|||
|
Unregistered |
И в API также. Поток завершается, когда ф-я потока возвращает управление. (В случае с TThread поток завершается, когда завершается ф-я ThreadWrapper) В API действительно есть ещё ф-и ExitThread и TerminateThread, к-рые насильственно завершают поток. Но пользоваться ими рекомендуется только в крайнем случае, если, например, поток завис (поскольку это запросто может привести к утечке ресурсов, а то и к чему-нибудь похуже). Так что слово "удобство" к ним неприменимо. И если уж на то пошло, применить их можно и к TThread'y. |
|||
|
||||
| Гость_Vano |
|
|||
|
Unregistered |
Поток делает цикл: (примерно 100 000 итераций)
... for i:=1 to 100000 do begin x:=random(255); sleep(1); form1.repaint; end; ..... вешаю запуск Потока на кнопку на форме. и как только я нажму кнопку.... я формой двигать не могу, сплошные тормоза, все равно что выносить этот цикл в другой поток что не выносить. подскажите как сделать чтобы я мог на форме спокойно работать, а поток пускай себе работает. |
|||
|
||||
| Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: нет Всего: 2 |
Убери form1.repaint; и все будет нормально. Окно и так перерисуется в случае надобности (ему винда сообщение пошлет)
Это сообщение отредактировал(а) Ars - 24.11.2003, 18:17 -------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
| Unregistered |
|
|||
|
Unregistered |
Ars
form1.repaint; убрал все равно тормозит |
|||
|
||||
| Ars |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: нет Всего: 2 |
Странно... Посмотри в какой-нибудь проге мониторинга ресурсов (TaskInfo, например), сколько процессорного времени съедает твой поток. Да, и можно попробовать Sleep(100). Если и после этого будет тормозить, то дело не в этом цикле. -------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
|||
|
||||
| Pushkin |
|
|||
|
Unregistered |
он просто нагружает память, загружает на 95%, а от проц нифига не загружает (на 40% максимум)
|
|||
|
||||
| Ars |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 28.8.2003 Где: Московская обл. Репутация: нет Всего: 2 |
Это не может загружать память. -------------------- Есть многое на свете, друг Горацио, С чем очень долго можно прое..! |
||||
|
|||||
| pegu |
|
|||
|
Unregistered |
приоритет в идле
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |