![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с потоками
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. Много нового найдете.