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