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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TThread, Эффективно прекратить работу 
:(
    Опции темы
mikleN
Дата 1.9.2004, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Уважаемый ALL, Если кто из вас имеет опыт работы с TThread подскажите, please, способ, чтобы быстро тушить триаду. Ситуация такая - есть поток данных в реальном времени, их надо обрабатывать. Чтобы не прерывался прием новых данных, обработка происходит в новой триаде. Обработка довольно длительная. Логика принята такая - если предыдущая триада завершилась,то создаем новую и все нормально. Если предудущая не завершена, то делаем Thread.Terminate, после чего создаем новую Thread.Create. Так вот иногда предыдущая не исчезает быстро и даже некотрое время они работают вместе и программа дохнет. Так вот вопрос существует ли способ быстрого тушения, только очищая стек, т.е. не применяя форсированную winAPI функцию, котороая не освобождает стек.
Применение методла .waifor не очень желательно, так как это замедляет, к тому же я не понял куда его надо вставлять.
Либо может создавать пару триад для поочередной работы.
Вот если есть у кого какие соображения - поделитесь пожалуйста.
Спасибо.
PM MAIL   Вверх
Girder
Дата 1.9.2004, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

Репутация: 31
Всего: 155



Метод Terminate — это указание потоку завершиться, с возможностью корректно освободить ресурсы!
Путей здесь много, к примеру:
1)Добавляй глобальный флаг и при выходе из Execute меняй его, а в новом потока проверяй.
2)Прежде чем создать новый поток проверяй:
Код
Try
Твой_Поток.WaitFor
except
end;


Для немедленного завершения потока, можеш использовать TerminateThread - но енто опасная штука smile.gif

Это сообщение отредактировал(а) Girder - 1.9.2004, 15:49


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
mikleN
Дата 1.9.2004, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Girder @ 1.9.2004, 15:48)
1)Добавляй глобальный флаг и при выходе из Execute меняй его, а в новом потока проверяй.

Это я делаю.
Цитата(Girder @ 1.9.2004, 15:48)
2)Прежде чем создать новый поток проверяй:
Код
Try
Твой_Поток.WaitFor
except
end;

не понял я как работает .WaitFor чего он ждет.
такой код
.Terminate;
.waiFor;
.Create();
почему то не работет у меня.

Цитата(Girder @ 1.9.2004, 15:48)

Try
Твой_Поток.WaitFor
except
end;


Т.е. логика такая если триада выполнена то будет выполняться Except, если же продолжается то будеt try стоять. А он что сам будет стоять , там тормоза никакого не надо?
Спасибо.

Это сообщение отредактировал(а) mikleN - 1.9.2004, 16:22
PM MAIL   Вверх
_hunter
Дата 1.9.2004, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



для "быстрого тшения" имеет смысл использовать самописный "мэнэджер потоков" который выделяет память под все переменные, используемые в потоках. Соответственно при вызове TerminateThread() память потеряна не будет

P.S.
Terminate() просто устанвливает флаг Terminated а ответственность за остановку берет на себя поток ( поэтом если ты редко проверяеш этот флаг возможно большое время выхода )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Girder
Дата 1.9.2004, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

Репутация: 31
Всего: 155



_hunter согласен.

Цитата
Т.е. логика такая если триада выполнена то будет выполняться Except, если же продолжается то будеt try стоять. А он что сам будет стоять , там тормоза никакого не надо?
Да нет. Просто WaitFor может закончится ошибкой, по этому я его и заключил в Try except end;

Пример использования:
Т1:TMyThread - некий твой переопределенный класс
Код

type
//Класс - который будет сообщать потоку что он должен завершится и ждать окончания завершения потока
TKillThread = class(TThread)
private
 { Private declarations }
protected
 Kill:TThread;
 procedure Execute; override;
end;
...
procedure TKillThread.Execute;
begin
Kill.Terminate;
try
 Kill.WaitFor;
except
end;
T1 := TMyThread.Create(False);
end;
....

procedure TForm1.Button1Click(Sender: TObject);
//Вот так можно удалять
var x:TKillThread;
begin
T1:=TMyThread.Create(False); //Данная строчка - для примера
x:=TKillThread.Create(true);
x.FreeOnTerminate:=true;
x.Kill:=t1;
x.Resume;
end;


Удачи.

Это сообщение отредактировал(а) Girder - 1.9.2004, 17:52


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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