Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с потоками


asd ©   (2010-11-15 23:20:00) 

Здравствуйте. Работаю с потоками.

 TMyClass = class (TThread)
 public
   constructor Create(i: integer); reintroduce;
   destructor Destroy(); override;
   procedure Execute(); override;
 end;
{ TMyClass }

constructor TMyClass.Create(i: integer);
begin
 inherited Create(true);
 FreeOnTerminate := true;
end;

destructor TMyClass.Destroy;
begin
 Form1.Memo1.Lines.Add('sss');
 inherited;
end;

procedure TMyClass.Execute;
var
 i: integer;
begin
 i := 0;
 while i < 1000 do begin
   inc(i);
 end;
 Form1.Memo1.Lines.Add('Terminate');
 Terminate();
end;


Далее я создаю поток и запускаю его

procedure TForm1.Button1Click(Sender: TObject);
var
 cl: TMyClass;
begin
 cl := TMyClass.Create(5);
 cl.Execute();
end;


Проблема в том что после отработки метода Execute() поток не освобождается. Мне нужно чтобы поток сам уничтожался после отработки Execute. Как этого добится?


Amoeba_   (2010-11-15 23:33:00) [1]

Смотрим на этот код (то, где первая ошибка):

> procedure TMyClass.Execute;
> var
>  i: integer;
> begin
>  i := 0;
>  while i < 1000 do begin
>    inc(i);
>  end;
> Form1.Memo1.Lines.Add('Terminate');
>
Terminate();
> end;

Читал, что было Delphi написано в модуле потока? Придется процитировать:
Methods and properties of objects in visual components can only be used in a method called using Synchronize.

А теперь срочно читать эту статью до полного просветления:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1370


Юрий Зотов   (2010-11-15 23:30:00) [2]

Из Execute уберите 2 строки:
Form1.Memo1.Lines.Add('Terminate');
Terminate();


Из деструктора уберите 1 строку:
Form1.Memo1.Lines.Add('sss')

Процедуру запуска перепишите:
procedure TForm1.Button1Click(Sender: TObject);
begin
 TMyClass.Create(5).Resume
end;


Потом поставьте в деструкторе точку останова, запустите программу и убедитесь, что все работает.

Потом читайте справку по классу TThread. Много нового найдете.


Наверх

Титульная страница Поиск, карта сайта Написать письмо