Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.04.19;
Скачать: [xml.tar.bz2];

Вниз

Как убить нить?   Найти похожие ветки 

 
faiwer ©   (2009-03-02 17:49) [0]

Как правильно убить нить? (Thread)
попробовал разные способы, но ни 1 не убил.. во всяком случае когда я через указатель обращаюсь обратно к нити она функционирует оО


 
Сергей М. ©   (2009-03-02 17:53) [1]


> Как правильно убить нить?


Не надо ее убивать, если она твоя.
Надо научить ее умирать самостоятельно, по твоей команде.


> когда я через указатель обращаюсь обратно к нити она функционирует


Чавой-то ?

"Обратно к нити" это еще куда ?)


 
faiwer ©   (2009-03-02 21:44) [2]


> Не надо ее убивать, если она твоя.
> Надо научить ее умирать самостоятельно, по твоей команде.
>

она моя. а вот как её научить умирать? я их уже тапками давлю - не дохнут =)

> Чавой-то ?
> "Обратно к нити" это еще куда ?)



> TFileConnection = class(TThread)
> private
>   ...
> protected
>   procedure Execute; override;
>   ...
> end;
>
> PFileConnection = ^TFileConnection;
>
> var
> ...
>   FC: array of PFileConnection;


Через FC[x] я обращаюсь к нити =)
в качестве удаления нити делаю в её же процедуре:
пробовал
self.Terminate
Endthread и прочие

так вот FC[X].WaitFor как я понял, выжидает пока нить у которой эта функция вызывается не "умрёт"... срабатывает будто бы она умерла...

но я если я обращаюсь к етой нити о5 (я храню указатели на все нити) то она работает...

не знаю как обьяснить попонятнее =)

temp:=obj.point;


 
faiwer ©   (2009-03-02 21:46) [3]

terminatethread(FC[i-1].Handle,0);
вот последнее что я накопал... даже это их не гасит =)


 
faiwer ©   (2009-03-02 21:48) [4]

грубо говоря чтобы продолжать функционировать дальше я избавляюсь от указателей на эти нити... точнее переназначаю указатели на новые\старые нити:
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;


но учитывая что нити не "дохнут", а ещё учитывая что каждая нить создаёт для себя отдельную форму... в общем это триллер =)


 
Strate ©   (2009-03-02 22:06) [5]

А в Execute свойство Terminated обрабатывается?


 
faiwer ©   (2009-03-02 22:13) [6]

if terminated then ... выйти ...?

в общем мне нужно, чтобы нить по завершению Execute сама себя убивала

Procedure T////.Execute;
begin
while (not Terminated) and ... do begin
end;
SELFKILL!!
end;

вот метода SELFKILL который бы действительно действовал - мне не хватает =)


 
{RASkov} ©   (2009-03-02 22:39) [7]

property FreeOnTerminate
?


 
DVM ©   (2009-03-02 23:07) [8]


> faiwer ©   (02.03.09 22:13) [6]


> в общем мне нужно, чтобы нить по завершению Execute сама
> себя убивала

Она и так умрет. А вот экземпляр объекта производного от TThread продолжит жить.


 
Anatoly Podgoretsky ©   (2009-03-02 23:24) [9]

> faiwer  (02.03.2009 22:13:06)  [6]

Ну с этим методом все просто, напиши так

Procedure T////.Execute;
begin
while (not Terminated) and ... do begin
end;
// SELFKILL!!
end;


 
faiwer ©   (2009-03-02 23:39) [10]


> Она и так умрет. А вот экземпляр объекта производного от
> TThread продолжит жить.


так если он (обьект TThread) умирает, то почему же если я обращаюсь к его полям и функциям после его смерти я не вижу ошибок? =))) или ето такая реализация особая, и я могу не забивать голову ерундой? =)


 
Amoeba ©   (2009-03-03 01:27) [11]


> PFileConnection = ^TFileConnection;
> var
> ...
>   FC: array of PFileConnection;

А это еще зачем?
Достаточно
FC: array of TFileConnection;

Нечего плодить указатели на указатели.


 
DVM ©   (2009-03-03 01:37) [12]


> faiwer ©   (02.03.09 23:39) [10]


> так если он (обьект TThread) умирает

он как раз не умирает, но поток который он породил после окончания выполнения Execute умрет.

Чтобы объект TThread сам умирал после окончания работы потока надо где то, например в начале метода Execute вставить FreeOnTerminate := true;

Только это крайне глюконосная фича и я бы ее не советовал использовать.


 
faiwer ©   (2009-03-03 04:37) [13]


> А это еще зачем?
> Достаточно
> FC: array of TFileConnection;
>
> Нечего плодить указатели на указатели.


ну вот понадобилось мне удалить #5 указатель, что я буду делать? если я сделаю FC[4]:=FC[Length(FC)] или чтонибудь подобное до того как FC[4] окончательно умрёт я получу фаталэррор. =)


 
faiwer ©   (2009-03-03 04:41) [14]


> Чтобы объект TThread сам умирал после окончания работы потока
> надо где то, например в начале метода Execute вставить FreeOnTerminate
> := true;
> Только это крайне глюконосная фича и я бы ее не советовал
> использовать.


спс... не знаю чем эета вещь глючна но я думаю это всяко лучше плодить за собой мусор =)


 
Anatoly Podgoretsky ©   (2009-03-03 08:51) [15]


> так если он (обьект TThread) умирает, то почему же если
> я обращаюсь к его полям и функциям после его смерти я не
> вижу ошибок? =)))

Ты так больше не делай.


 
Григорьев Антон ©   (2009-03-03 08:53) [16]


> ак если он (обьект TThread) умирает, то почему же если я
> обращаюсь к его полям и функциям после его смерти я не вижу
> ошибок?

А это с любым объектом так бывает. Менеджер памяти Delphi обычно не отдаёт системе освобождённую память сразу, а придерживает её на случай, если она кому-то ещё понадобится. Когда мы уничтожаем объект, память, занимаемая им, просто помечается как неиспользуемая, но не очищается, в ней продолжают лежать те же данные, что и до удаления, пока эту память не займёт кто-то другой. А переменная объектного типа - это просто ссылка на эту память. При обращении по этой ссылке мы получаем данные из уже уничтоженного объекта до тех пор, пока эта память не будет выделена для других нужд, а информамция в ней - перетёрта. Это и создаёт иллюзию того, что объект продолжает существовать после удаления.


 
KSergey ©   (2009-03-03 10:18) [17]

Автор, есть подозрнение, что вы путаете (вернее - смешиваете в одно) экземпляр дельфийского объекта TThread (ну или потомка) и Windows объект "нить" (thread). Это разные вещи.


 
faiwer ©   (2009-03-03 13:23) [18]

КSergey

> TFileConnection = class(TThread)
> private
>   ...
> protected
>   procedure Execute; override;
>   ...
> end;

выкладывал это выше. именно это я подразумеваю под нитью =) и создаю я его через FC[i]:=TFileConnection.Create(false) а не через CreateThread =)


 
Сергей М. ©   (2009-03-03 13:26) [19]


> это я подразумеваю под нитью


Это не нить, а просто фрагмент декларации некоего класса-наследника TThread


 
Сергей М. ©   (2009-03-03 13:36) [20]


> учитывая что каждая нить создаёт для себя отдельную форму.
> .. в общем это триллер


Не то слово - ужасник !)
Хичхок идет лесом и нервно курит)


 
KSergey ©   (2009-03-03 15:45) [21]

> faiwer ©   (03.03.09 13:23) [18]
и создаю я его через FC[i]:=TFileConnection.Create(false)

Это создается дельфийский объект. Если у него вызвать Terminate - он не разрушается, понятно, если  FreeOnTerminate не пользовалось. Все поля его доступны до разрушения без проблем.

но вместе с ним создается виндовс объект "поток" (нить), который живет сам по себе и его время хизни ен связано с дельфийским экземпляром сообще никак. (Ну может тама есть какие-то связки типа дельфийский не разрушается пока существует виндовый тред - тут не знаю, копать лень.)


 
faiwer ©   (2009-03-03 16:11) [22]


> но вместе с ним создается виндовс объект "поток" (нить),
>  который живет сам по себе и его время хизни ен связано
> с дельфийским экземпляром сообще никак. (Ну может тама есть
> какие-то связки типа дельфийский не разрушается пока существует
> виндовый тред - тут не знаю, копать лень.)

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.04.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.055 c
2-1235949145
WeX
2009-03-02 02:12
2009.04.19
Помогите с TTreeView


1-1210700758
Olegz77
2008-05-13 21:45
2009.04.19
Получить размер кнопки ComboBox


2-1235977011
worldmen
2009-03-02 09:56
2009.04.19
Ошибка : "Неверный дескриптор" и "Параметр задан не верно"


15-1234803136
Maaacheba
2009-02-16 19:52
2009.04.19
Получение имени метода


4-1208255815
vopros
2008-04-15 14:36
2009.04.19
Почему такой код в Висте не работает а в XP работает?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский