![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как убить нить? [D7, XP]
faiwer © (2009-03-02 17:49:00)Как правильно убить нить? (Thread)
попробовал разные способы, но ни 1 не убил.. во всяком случае когда я через указатель обращаюсь обратно к нити она функционирует оО
faiwer (2009-03-03 16:11:00) [1]
> но вместе с ним создается виндовс объект "поток" (нить),
> который живет сам по себе и его время хизни ен связано
> с дельфийским экземпляром сообще никак. (Ну может тама есть
> какие-то связки типа дельфийский не разрушается пока существует
> виндовый тред - тут не знаю, копать лень.)
ммм а если я таких обьектов создаю и удаляю много во время работы программы, получается, что возможно, что все созданные ими потоки остаются... это не приведёт к каким нибудь проблемам?
KSergey (2009-03-03 15:45:00) [2]> faiwer © (03.03.09 13:23) [18]
и создаю я его через FC[i]:=TFileConnection.Create(false)
Это создается дельфийский объект. Если у него вызвать Terminate - он не разрушается, понятно, если FreeOnTerminate не пользовалось. Все поля его доступны до разрушения без проблем.
но вместе с ним создается виндовс объект "поток" (нить), который живет сам по себе и его время хизни ен связано с дельфийским экземпляром сообще никак. (Ну может тама есть какие-то связки типа дельфийский не разрушается пока существует виндовый тред - тут не знаю, копать лень.)
Сергей М. (2009-03-03 13:36:00) [3]
> учитывая что каждая нить создаётдля себя отдельную форму.
> .. в общем это триллер
Не то слово - ужасник !)
Хичхок идет лесом и нервно курит)
Сергей М. (2009-03-03 13:26:00) [4]
> это я подразумеваю под нитью
Это не нить, а просто фрагмент декларации некоего класса-наследника TThread
faiwer (2009-03-03 13:23:00) [5]КSergey
> TFileConnection = class(TThread)
> private
> ...
> protected
> procedure Execute; override;
> ...
> end;
выкладывал это выше. именно это я подразумеваю под нитью =) и создаю я его через FC[i]:=TFileConnection.Create(false) а не через CreateThread =)
KSergey (2009-03-03 10:18:00) [6]Автор, есть подозрнение, что вы путаете (вернее - смешиваете в одно) экземпляр дельфийского объекта TThread (ну или потомка) и Windows объект "нить" (thread). Это разные вещи.
Григорьев Антон (2009-03-03 08:53:00) [7]
> ак если он (обьект TThread) умирает, то почему же если я
> обращаюсь к его полям и функциям после его смерти я не вижу
> ошибок?
А это с любым объектом так бывает. Менеджер памяти Delphi обычно не отдаёт системе освобождённую память сразу, а придерживает её на случай, если она кому-то ещё понадобится. Когда мы уничтожаем объект, память, занимаемая им, просто помечается как неиспользуемая, но не очищается, в ней продолжают лежать те же данные, что и до удаления, пока эту память не займёт кто-то другой. А переменная объектного типа - это просто ссылка на эту память. При обращении по этой ссылке мы получаем данные из уже уничтоженного объекта до тех пор, пока эта память не будет выделена для других нужд, а информамция в ней - перетёрта. Это и создаёт иллюзию того, что объект продолжает существовать после удаления.
Anatoly Podgoretsky (2009-03-03 08:51:00) [8]
> так если он (обьект TThread) умирает, то почему же если
> я обращаюсь к его полям и функциям после его смерти я не
> вижу ошибок? =)))
Ты так больше не делай.
faiwer (2009-03-03 04:41:00) [9]
> Чтобы объект TThread сам умирал после окончания работы потока
> надо где то, например в начале метода Execute вставить FreeOnTerminate
> := true;
> Только это крайне глюконосная фича и я бы ее не советовал
> использовать.
спс... не знаю чем эета вещь глючна но я думаю это всяко лучше плодить за собой мусор =)
faiwer (2009-03-03 04:37:00) [10]
> А это еще зачем?
> Достаточно
> FC: array of TFileConnection;
>
> Нечего плодить указатели на указатели.
ну вот понадобилось мне удалить #5 указатель, что я буду делать? если я сделаю FC[4]:=FC[Length(FC)] или чтонибудь подобное до того как FC[4] окончательно умрёт я получу фаталэррор. =)
DVM (2009-03-03 01:37:00) [11]
> faiwer © (02.03.09 23:39) [10]
> так если он (обьект TThread) умирает
он как раз не умирает, но поток который он породил после окончания выполнения Execute умрет.
Чтобы объект TThread сам умирал после окончания работы потока надо где то, например в начале метода Execute вставить FreeOnTerminate := true;
Только это крайне глюконосная фича и я бы ее не советовал использовать.
Amoeba (2009-03-03 01:27:00) [12]
> PFileConnection = ^TFileConnection;
> var
> ...
> FC: array of PFileConnection;
А это еще зачем?
Достаточно
FC: array of TFileConnection;
Нечего плодить указатели на указатели.
faiwer (2009-03-02 23:39:00) [13]
> Она и так умрет. А вот экземпляр объекта производного от
> TThread продолжит жить.
так если он (обьект TThread) умирает, то почему же если я обращаюсь к его полям и функциям после его смерти я не вижу ошибок? =))) или ето такая реализация особая, и я могу не забивать голову ерундой? =)
Anatoly Podgoretsky (2009-03-02 23:24:00) [14]> faiwer (02.03.2009 22:13:06) [6]
Ну с этим методом все просто, напиши так
Procedure T////.Execute;
begin
while (not Terminated) and ... do begin
end;
// SELFKILL!!
end;
DVM (2009-03-02 23:07:00) [15]
> faiwer © (02.03.09 22:13) [6]
> в общем мне нужно, чтобы нить по завершению Execute сама
> себя убивала
Она и так умрет. А вот экземпляр объекта производного от TThread продолжит жить.
{RASkov} (2009-03-02 22:39:00) [16]property FreeOnTerminate
?
faiwer (2009-03-02 22:13:00) [17]if terminated then ... выйти ...?
в общем мне нужно, чтобы нить по завершению Execute сама себя убивала
Procedure T////.Execute;
begin
while (not Terminated) and ... do begin
end;
SELFKILL!!
end;
вот метода SELFKILL который бы действительно действовал - мне не хватает =)
Strate (2009-03-02 22:06:00) [18]А в Execute свойство Terminated обрабатывается?
faiwer (2009-03-02 21:48:00) [19]грубо говоря чтобы продолжать функционировать дальше я избавляюсь от указателей на эти нити... точнее переназначаю указатели на новые\старые нити:
if i=Length(FC) then Setlength(FC,Length(FC)-1) else begin
FC[i-1]:=FC[Length(FC)-1];
Setlength(FC,Length(FC)-1);
end;
но учитывая что нити не "дохнут", а ещё учитывая что каждая нить создаёт для себя отдельную форму... в общем это триллер =)
faiwer (2009-03-02 21:46:00) [20]terminatethread(FC[i-1].Handle,0);
вот последнее что я накопал... даже это их не гасит =)