![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Destroy [D6, WinXP]
nikulin © (2003-01-21 10:09:00)Есть потомок класса TThread. В его конструкторе Create создаю обьекты TADOConnection, TServerSocket, TADODataSet.
Далее создаю этот TThread в другом модуле
try
FollowMeThread:=TFollowMeThread.Create(False);
FollowMeThread.FreeOnTerminate:=True;
FollowMeThread.Priority:=tpNormal;
except
end;
А где мне освобожать обьекты TADOConnection, TServerSocket, TADODataSet ???
Я попробовал в деструкторе, но этот код даже не вызывается когда
TThread уничтожается...
Подскажите где неправ пожалуйста.
destructor TFollowMeThread.Destroy;
begin
FADODataSet.Close;
FADODataSet.Free;
FServerSocket.Close;
FServerSocket.Free;
if not (stClosed in FADOConnection.State) then FADOConnection.Close;
FADOConnection.Free;
inherited;
end;
Юрий Зотов (2003-01-21 15:21:00) [1]> uw © (21.01.03 10:50)
Деструктор не вызывался потому, что была разорвана его цепочка наследования, а вовсе не потому, что Вы говорите. Как только было написано override - все стало нормально.
А Warnings существуют для того, чтобы их читать. Только, увы, не все и не всегда это делают.
uw (2003-01-21 10:57:00) [2]А зачем же тогда существуют Warnings?!
Skier (2003-01-21 10:55:00) [3]>uw
???!!!
uw (2003-01-21 10:50:00) [4]>Юрий Зотов
Деструктор не вызывается, потому что явно не вызывается либо Thread.Terminate, либо Thread.Free.
nikulin (2003-01-21 10:47:00) [5]2 Юрий Зотов
Спасибо огромное за помощь. Действительно не было override.
Юрий Зотов (2003-01-21 10:42:00) [6]> Я попробовал в деструкторе, но этот код даже не вызывается
> когда TThread уничтожается...
Не может такого быть. Все у Вас нормально, только проверьте, не забыли ли Вы написать overrideу деструктора.
uw (2003-01-21 10:34:00) [7]При нажатии кнопки деструктор вызывается!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMyThread = class(TThread)
destructor Destroy; override;
procedure Execute; override;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
MyThread: TMyThread;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin//
MyThread := TMyThread.Create(False);
MyThread.FreeOnTerminate := True;
end;
{ TMyThread }
destructor TMyThread.Destroy;
begin
inherited;
end;
procedure TMyThread.Execute;
begin
while NOT Terminated do begin
Sleep(100);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread.Terminate;
end;
end.
nikulin (2003-01-21 10:27:00) [8]Да TThread.FreeOnTerminate равно True, те поток уничтожается сразу после того как отработает метод Execute.
А где удалять обьекты? В методе Execute ?
Skier (2003-01-21 10:18:00) [9]
> Я попробовал в деструкторе, но этот код даже не вызывается
> когда
> TThread уничтожается...
TThread.FreeOnTerminate := True; ?