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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно убить поток, Заблудился в трёх соснах! 
:(
    Опции темы
zalex
Дата 2.2.2006, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть поток, его необходимо уничтожить, но по-человечески, а именно - что бы в момент убивания у него сработало какое нить событие. Как уничтожить и как описать событие?

Перепробовал много. Начал с того, что присвоил ONTerminate:=MyProcedure;
Но - если убивать поток Potok.Free, то событие не срабатывает.
Если при убийстве писать Potok.Terminate, то он не уничтожается, а прорабатывает до конца.
TerminateThread(Potok.Handle, 0); тожде не помогает - поток убивается, но события не возникает.
suspend вообще просто приостанавливает, а

Potok.suspend;
Potok.Terminate
не приводит к возникновению события smile))

Как быть? Понимаю, что всё наверняка проще простого, но уже запутался.

PM MAIL   Вверх
andrey_pst
Дата 2.2.2006, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 37
Регистрация: 24.4.2003
Где: Пермь

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



Цитата(zalex @ 2.2.2006, 02:12 Найти цитируемый пост)

Potok.Terminate

Не убивает поток, а устанавливает его свойство Terminate в true или false. При этом завершением работы потока нужно заниматься самому, например, проверяя значение свойства Terminate в методе TPotok.Execute:

Код

procedure TPotok.Execute;
begin
  ...
  
  // проверка - поток жив?
  if Terminated then
    exit;
end;

PM MAIL   Вверх
Vas
Дата 2.2.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

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



Делаю так, при создании ставлю свойство FreeOnTerminate:=True.
А в Destroy делаю что надо.
Код

Constructor TMyThread.Create(CreateSuspended: Boolean);
Begin
  inherited Create(CreateSuspended);
  FreeOnTerminate:=True;
End;

Destructor TMyThread.Destroy;
Begin
  //Do Something;....
  inherited;
End;






--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
zalex
Дата 2.2.2006, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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





Код

procedure TPotok.Execute;
begin
  ...
  
  // проверка - поток жив?
  if Terminated then
    exit;
end;


Угу. Разобрался, и для решения задачи, породившей этот вопрос вполне ответа хватает. Но если посмотреть глубже, если нет возможности проверить свойство Terminate, то как быть, нпример
Код

procedure TPotok.Execute;
begin
//Тут всего одна строчка
Жду посылки от внешнего устройства, коьторое может и ничего не прислать  
end;


PM MAIL   Вверх
Romikgy
Дата 2.2.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(zalex @ 2.2.2006, 09:59 Найти цитируемый пост)

коьторое может и ничего не прислать

таймауты делай


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Snowy
Дата 2.2.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Тогда убей жестоко:
Код

TerminateThread(Potok.Handle, 0);

PM MAIL   Вверх
zalex
Дата 2.2.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Snowy @ 2.2.2006, 11:36)
Тогда убей жестоко:
Код

TerminateThread(Potok.Handle, 0);

так тогда OnTerminate не срабатываетsmile*
Я хочу еще раз уточнить, чего хочу
1.Что бы поток убился
2. Что бы при таком убитии возникло у него какое либо событие.
Например вызов Free не помогает, т.е. получается иногда ситуация, что Destroy вызывается два раза.
Добавлено @ 18:29
Цитата(Romikgy @ 2.2.2006, 11:14)
Цитата(zalex @  2.2.2006,  09:59 Найти цитируемый пост)

коьторое может и ничего не прислать

таймауты делай

Что обозначают таймауты в данном посте не понял, но понял мысль. Сам её рассматривал, но как вспомогательный вариант. НЕужели нет ничего попроще, и не обходного, ведь куча других объектов удаляются без проблем, что в потоке такого особенного?
PM MAIL   Вверх
Snowy
Дата 2.2.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Цитата(zalex @ 2.2.2006, 18:26 Найти цитируемый пост)
так тогда OnTerminate не срабатывает*

А как он может сработать, если поток занят ожиданием?
Либо корректно завершай ожидание, либо убивай насильно.

PM MAIL   Вверх
zalex
Дата 2.2.2006, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А TerminateThread ессно никакими деструкторами не пользуется?
PM MAIL   Вверх
Snowy
Дата 2.2.2006, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Он вообще ничем не пользуется - просто делает свою работу.
Это функция WinAPI и не имеет отношения к дельфевым объектам.
Дельфийские способы уничтожения не уничтожают тред, а всего лишь выставляют флаг.
Если нужны решительные действия, то они не помогут.
PM MAIL   Вверх
Демо
Дата 2.2.2006, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

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



Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TTest=class(TThread)
  private
    procedure FOnTerminate(Sender: TObject);
  protected
    procedure Execute; override;
  public
    constructor Create;
    destructor Destroy;override;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Test: Ttest;

implementation

{$R *.dfm}

{ TTest }

constructor TTest.Create;
begin
  inherited Create(True);
  OnTerminate := FOnTerminate;
  Resume;
end;

destructor TTest.Destroy;
begin
  OnTerminate(Self);
  inherited;
end;

procedure TTest.Execute;
begin
  Sleep(500000);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Test := TTest.Create;
end;

procedure TTest.FOnTerminate(Sender: TObject);
begin
  ShowMessage('End Thread');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  TerminateThread(Test.Handle,0);
  Test.Free;  //Обязательно!
end;

end.


Добавлено @ 22:02
Либо написать свой поточный класс, что тоже не есть сложно...


--------------------
    
PM MAIL ICQ Skype   Вверх
Romikgy
Дата 3.2.2006, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(zalex @ 2.2.2006, 17:26 Найти цитируемый пост)

Что обозначают таймауты в данном посте не понял

Таймауты необходимы для процедур , которые могут не ответить , и ждать своего внутреннего события, по таймауту , такая ф-ция сбрасывается и отдает управление твоему потоку.
Как правило пользуются асинхроным вводом/выводом в таких случаях.
Ксати ты так и не сказал , что за ф-ция внутри потока , которая может не ответить?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
zalex
Дата 3.2.2006, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Мысль с таймаутами я понял, как и написал ранее smile, а неотвечающее устройчтво скорее гипотетическое. Или например, я жду пока у модема сигнал Ring сработает.(хотя сам понимаю, что это не ответ, ожидание ринга при помощи потока можно сделать очень красиво, например)

repeat
//очередной раз проверяю ринг
if Terminate then break;
until False;


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

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

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

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

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


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

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


 




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


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

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