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

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

Метод 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. И сразу поймешь, завершится поток сам по себе или нет.


Наверх

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