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

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

Многозадачность. TThread.


Leon-Z ©   (2011-03-04 11:38:00) 

Как завершить TThread ???

procedure TThraed.Execute;
begin
 Proc1;
 Proc2;
 Proc3;
end;

Я не использую цикла while в котором обычно проверяют
свойство Terminated:
while not Terminated do begin ... end
Процедуры Proc1, Proc2, Proc3 выполняются долго,
поэтому может возникнуть потребность просто "убить поток" во
время выполнения. Как это сделать ????????


Leonid Troyanovsky   (2011-03-04 17:26:00) [1]


> sniknik ©   (04.03.11 11:44) [1]

> ну убивай поток! он отомстит!

Вот умру и стану гнусно вонять.
И вы все подохните от этой вони.

;)

--
Regards, LVT.


Боброжелатель   (2011-03-04 14:07:00) [2]

а с эти кто то спорит?

С этим никто не спорит. Просто автор вопроса этого то ли не знает, то ли не понимает, о чем можно судить из его вопроса: "А без этого никак?" [3]. Собственно, я и объясняю автору вопроса, почему не следует делать "без этого".


clickmaker   (2011-03-04 13:36:00) [3]

> а ты попробуй, сделай поток такой функцией, запусти и нажми
> "крестик" на форме.
> только без установок в потоке всяких "вайтфор"...

ну по-нормальному, конечно все работать должно.
Однако, почему-то приложения виснут иногда )


sniknik   (2011-03-04 13:16:00) [4]

> то без вариантов TerminateThread.
а ты попробуй, сделай поток такой функцией, запусти и нажми "крестик" на форме.
только без установок в потоке всяких "вайтфор"...

вот и вариант.


Anatoly Podgoretsky   (2011-03-04 13:16:00) [5]


> Процедуры Proc1, Proc2, Proc3 выполняются долго,

Ты должен предусмотреть механизм экстренного выхода из Proc1, Proc2, Proc3
Больше ничего делать не надо


sniknik   (2011-03-04 13:12:00) [6]

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


clickmaker   (2011-03-04 13:11:00) [7]

> Причина очень веская - пользователь закрывает программу.

если долго выполняется атомарная операция, над которой нет контроля (ф-ия АПИ, к примеру), то без вариантов TerminateThread.
Но это, скорей, исключение. Обычно всегда можно какой-то флажок в цикле проверять. Другое дело, что усложняется логика, да и банально лень иногда )


sniknik   (2011-03-04 13:03:00) [8]

> Но что будет потом с недописанными файлами?
то же самое, что от принудительного терминирования извне, отсюда - "а если нет разницы", тогда мы идем к вам... т.е. "забей".


Боброжелатель   (2011-03-04 12:38:00) [9]

тогда "забей", закроется и без тебя

Думаю, если он открывает в потоке файлы на запись, то "забить" вряд ли получится. То есть, можно, конечно. Но что будет потом с недописанными файлами?
Впрочем, то же касается и открытых сокетов, пайпов, сетевых сессий более высокого уровня (всяких там POP3, SMTP) и прочего, что выходит за пределы этой, конкретно взятой программы. Все что "торчит наружу" следует закрывать корректно.


sniknik   (2011-03-04 12:28:00) [10]

> Причина очень веская - пользователь закрывает программу.
тогда "забей", закроется и без тебя.


Leon-Z   (2011-03-04 11:58:00) [11]


> sniknik ©   (04.03.11 11:44) [1]
> > просто "убить поток"ну убивай поток! он отомстит! тем
> более "просто",причина должна быть веская... например выход
> из программы из-за критической ошибки (при которой "убийство"
> и так делается).

Причина очень веская - пользователь закрывает программу.

> Боброжелатель   (04.03.11 11:46) [2]
> Правильнее будет проверять Terminated внутри Proc1, Proc2,
>  Proc3.

А без этого никак ??? Может можно как-нибудь по другому?


Боброжелатель   (2011-03-04 11:46:00) [12]

Правильнее будет проверять Terminated внутри Proc1, Proc2, Proc3.
Можно еще TerminateThread(Thread.Handle...), но так лучше не делать, ибо любое "убивание" чревато последствиями.


sniknik   (2011-03-04 11:44:00) [13]

> просто "убить поток"
ну убивай поток! он отомстит!

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


Наверх

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