![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Метод Terminate в дополнительного потока [D7]
Андрей Пл © (2007-08-29 15:08:00)У меня есть поток который в цикле что то делает скажите
всегда ли надо в цыкле проверять свойство Terminated потока завершения потока?
или достаточно в основной программе вызвать метод Terminate и поток сам завершиться?
Заранее спасибо.
evvcom (2007-08-29 16:59:00) [1]
> ты имееш ввиду при помощи сообщений (ну это время вспоминать
> работу с ними)
Ну так хороший повод для того, чтобы заполнить пробел в твоей памяти :)
И в догонку опять же для заполнения пробела: слово "ц икл" пишется через "и"
Сергей М. (2007-08-29 16:12:00) [2]
> Германн © (29.08.07 16:10) [16]
Но эти грабли одни из самых больнобьющих)
Германн (2007-08-29 16:10:00) [3]
> Сергей М. © (29.08.07 16:05) [15]
>
>
> > то что было нкжно
>
>
> Только не вздумай при этом устанавливать св-во FreeOnTerminate
> = True - грабли получишь)
>
Тут и без этого на каждом шагу могут появиться грабли.
Сергей М. (2007-08-29 16:05:00) [4]
> то что было нкжно
Только не вздумай при этом устанавливать св-во FreeOnTerminate = True - грабли получишь)
Андрей Пл (2007-08-29 16:04:00) [5]Всем спасибо
varThreardOpros.Terminate; //команда потоку закругляться по хозяйству
varThreardOpros.WaitFor; //ждем собственно закругления
KillComm; //теперь можно спокойно килить ресурс
то что было нкжно!!!
Anatoly Podgoretsky (2007-08-29 15:50:00) [6]> Reindeer Moss Eater (29.08.2007 15:43:09) [9]
Для главного потока есть обработчик, вроде OnTerminate или как то подобно.
Reindeer Moss Eater (2007-08-29 15:44:00) [7]ты имееш ввиду при помощи сообщений (ну это время вспоминать работу с ними)
Это уж от личных сексуальных пристрастий зависит.
Можно сообщениями, можно callback, можно по всякому....
Андрей Пл (2007-08-29 15:43:00) [8]>Reindeer Moss Eater © (29.08.07 15:39) [5]
>При выходе из Execute оповести главный поток и все.
ты имееш ввиду при помощи сообщений (ну это время вспоминать работу с ними)
Сергей М. (2007-08-29 15:43:00) [9]varThreardOpros.Terminate; //команда потоку закругляться по хозяйству
varThreardOpros.WaitFor;//ждем собственно закругления
KillComm; //теперь можно спокойно килить ресурс
Reindeer Moss Eater (2007-08-29 15:43:00) [10]Он его открыл в главном потоке. Лучше бы и закрывать там же.
Хотя конечно все равно.
Anatoly Podgoretsky (2007-08-29 15:41:00) [11]> Андрей Пл (29.08.2007 15:37:04) [4]
if Terminated или перед/после выхода из цикла, порт желательно закрывать, а не расчитывать на систему.
Reindeer Moss Eater (2007-08-29 15:41:00) [12]Ну так прекращай ее и делай брейк из цикла
Андрей Пл (2007-08-29 15:39:00) [13]т.е у меня возникает такая ситуация метод Terminate после него закрыл сразу порт процедурой KillComm а в цыкле доп. потока идет еще работа с портом!
Reindeer Moss Eater (2007-08-29 15:39:00) [14]При выходе из Execute оповести главный поток и все.
Андрей Пл (2007-08-29 15:37:00) [15]ясно надо ставить что то типа:
while not Terminated do
begin
...
end;
если ошибаюсь поправте!!!
Еще вопрос в дополнительном потоке у меня идет работа с СОМ портом который был открыт из основной программы. При желании я хочу прекратить работу потока и закрыть порт. Вопрос как мне из основного потока узнать что поток уже завершился ведь в промежутке выполнения команд
varThreardOpros.Terminate;
KillComm;
поток может еще не завершиться т.е
может еще выполняться команды в цыкле
while not Terminated do
begin
... //т.е вот те команды что сдесь!!!
end;
Юрий Зотов (2007-08-29 15:30:00) [16]> Андрей Пл (29.08.07 15:08)
Метод Terminate просто устанавливает свойство Terminated и больше ничего не делает. Остсюда вывод: если в основной программе вызвать метод Terminate, то поток сам по себе НЕ завершится. Нужно в методе Execute проверять свойство Terminated и если оно True, то выходить из метода. Это и будет завершением потока.
Сергей М. (2007-08-29 15:18:00) [17]
> всегда ли надо в цыкле проверять свойство Terminated
Не всегда.
Но это вряд ли твой случай.
Reindeer Moss Eater (2007-08-29 15:10:00) [18]А ты код посмотри. Что именно делает вызов Terminate. И сразу поймешь, завершится поток сам по себе или нет.