Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про TThread, Как сделать откат 
:(
    Опции темы
кварк
Дата 10.9.2002, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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. Вопрос задан, чтобы узнать "как люди делают". - Хочется ведь делать грамотно :)
PM MAIL   Вверх
Dapo
Дата 10.9.2002, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 вызывается, но поток не прерывается.) Следовательно, для того чтобы отловить момент завершения потока, нужно передавать какой-нибудь флаг в руки... :) точнее, в Execute потока по которому вызывать(или не вызывать) метод DoTerminate. Поправте если что не так.
PM MAIL   Вверх
кварк
Дата 10.9.2002, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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, а не завершает поток немедленно. На практике, вроде, тоже самое.
PM MAIL   Вверх
Dapo
Дата 11.9.2002, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



Цитата
А потом, как я понял из Delphi help, TThread.Terminate ставит свойство Terminated в true, а не завершает поток немедленно. На практике, вроде, тоже самое.

Да, на счет "немедленно" - я погорячился. Terminate  устанавливает св-во Terminated в True, которое показывает что поток будет прерван ТАК СКОРО НА СКОЛЬКО ЭТО ВОЗМОЖНО. В API по-другому, там поток завершается именно "немедленно ". Даже не знаю, что удобнее  ???
PM MAIL   Вверх
Fantasist
Дата 12.9.2002, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Цитата
Terminate  устанавливает св-во Terminated в True, которое показывает что поток будет прерван ТАК СКОРО НА СКОЛЬКО ЭТО ВОЗМОЖНО


Ну показывает это чисто условно. Скорее это предложение потоку завершиться, а так, как ты сам контролируешь Execute, то завершиться он или нет решать тебе.
Цитата

В API по-другому, там поток завершается именно "немедленно"


Так в API и классов нет.  :D
А делфийский TThread - это обертка над API, так что как только ты выйдешь из своего Execute, поток "немедленно" завершится. Почти. Он еще выполнит еще эти строчки:
Код

   FreeThread := Thread.FFreeOnTerminate;
   Result := Thread.FReturnValue;
   Thread.FFinished := True;
   Thread.DoTerminate;
   if FreeThread then Thread.Free;
   EndThread(Result);

В тот момент, как функция EndThread вернет значение, поток только что был завершен. Но все эти строчки выполняться уже после твоего кода.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Le Taon
Дата 27.9.2002, 06:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
В API по-другому, там поток завершается именно "немедленно ". Даже не знаю, что удобнее


И в API также. Поток завершается, когда ф-я потока возвращает управление.
(В случае с TThread поток завершается, когда завершается ф-я ThreadWrapper)

В API действительно есть ещё ф-и ExitThread и TerminateThread, к-рые насильственно завершают поток.
Но пользоваться ими рекомендуется только в крайнем случае, если, например, поток завис (поскольку это запросто может привести к утечке ресурсов, а то и к чему-нибудь похуже).
Так что слово "удобство" к ним неприменимо.

И если уж на то пошло, применить их можно и к TThread'y.
  Вверх
Гость_Vano
Дата 24.11.2003, 17:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Поток делает цикл: (примерно 100 000 итераций)
...
for i:=1 to 100000 do
begin
x:=random(255);
sleep(1);
form1.repaint;
end;

.....
вешаю запуск Потока на кнопку на форме.
и как только я нажму кнопку.... я формой двигать не могу, сплошные тормоза,
все равно что выносить этот цикл в другой поток что не выносить.
подскажите как сделать чтобы я мог на форме спокойно работать, а поток пускай себе работает.
  Вверх
Ars
Дата 24.11.2003, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

Репутация: нет
Всего: 2



Убери form1.repaint; и все будет нормально. Окно и так перерисуется в случае надобности (ему винда сообщение пошлет)

Это сообщение отредактировал(а) Ars - 24.11.2003, 18:17


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
Unregistered
Дата 28.11.2003, 16:41 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ars
form1.repaint; убрал все равно тормозит sad.gif
  Вверх
Ars
Дата 2.12.2003, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

Репутация: нет
Всего: 2



Цитата
form1.repaint; убрал все равно тормозит 

Странно... Посмотри в какой-нибудь проге мониторинга ресурсов (TaskInfo, например), сколько процессорного времени съедает твой поток.
Да, и можно попробовать Sleep(100). Если и после этого будет тормозить, то дело не в этом цикле.


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
Pushkin
  Дата 2.12.2003, 19:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











он просто нагружает память, загружает на 95%, а от проц нифига не загружает (на 40% максимум)
  Вверх
Ars
Дата 3.12.2003, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

Репутация: нет
Всего: 2



Цитата
for i:=1 to 100000 do
begin
x:=random(255);
sleep(1);
form1.repaint;
end;

Цитата
он просто нагружает память, загружает на 95%, а от проц нифига не загружает (на 40% максимум)

Это не может загружать память.


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
pegu
Дата 22.2.2004, 01:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











приоритет в идле
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0778 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.