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

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

TPotok_Com.Terminate [D7, XP]


TThread ©   (2011-12-29 01:55:00) 

Приветствую всех!
Подскажите ответ на такой вопрос
останавливаю поток
вот таким кодом

TPotok_Com.Terminate

далее запускаю процедуру

if (not Assigned(TPotok_Com)) then
 Begin
  TPotok_Com := TPotok.Create(False);
  TPotok_Com.FreeOnTerminate := True;
  TPotok_Com.Priority        := tpLower;
  TPotok_Com.Resume;
 End;

Но TPotok_Com - почему то Assigned

И он его соответсвенно заново не создаёт.Мастера, подскажите что делаю не так?


KilkennyCat   (2011-12-29 03:01:00) [1]


> На домашнем компе просто ник сразу вставляется - на рабочем
> - нет.

ночью - одна, днем - другая (с) Шрек


vegarulez   (2011-12-29 03:00:00) [2]

RWolf ©   (29.12.11 02:32) [10]

Ок - заработало.
Мастера - спасибо за помощь!


vegarulez   (2011-12-29 02:47:00) [3]

vegarulez   (29.12.11 02:19) [8]

На домашнем компе просто ник сразу вставляется - на рабочем - нет.


Германн   (2011-12-29 02:40:00) [4]


> vegarulez   (29.12.11 02:32) [11]
>
> Германн ©   (29.12.11 02:25) [9]
>
> Спасибо. Заработало.
>

Совет номер раз. Используй только один ник в своём
вопросе. Иначе трудно отвечать на "твои" вопросы.


vegarulez   (2011-12-29 02:34:00) [5]

2 RWolf ©   (29.12.11 02:32) [10]

Ок - сейчас попробую исправить, то что написал в vegarulez   (29.12.11 02:32) [11]


RWolf   (2011-12-29 02:32:00) [6]


>
> Waitfor вообще ощибку выдает -



> FreeOnTerminate:=True

вот потому и выдаёт, что уничтожается сразу после завершения.


vegarulez   (2011-12-29 02:32:00) [7]

Германн ©   (29.12.11 02:25) [9]

Спасибо. Заработало.

Почитал про TThread - насторожил момент про WaitFor который у меня почему-то выдаёт ошибку.
Просто если вдруг потоку будет дана команда на остановку

TPotok_Com.Terminate
TPotok_Com:=nil

но он ещё не закончит свою работу - а я его уже следом процедурой вызываю опять.
Подскажите как сделать правильно WaitFor - чтобы дождаться его 100% завершения и только потом переходить на процедуру запуска?


Германн   (2011-12-29 02:25:00) [8]


> 2 Германн ©   (29.12.11 02:12) [5]
> Подскажите пожалуйста как очистить указатель на экземпляр?
>
>


> останавливаю поток
> вот таким кодом
>
> TPotok_Com.Terminate

TPotok_Com:=nil.


vegarulez   (2011-12-29 02:19:00) [9]

Германн ©   (29.12.11 02:14) [6]
Топик мой - просто с рабочего компа написал.
Логин подписал уже в коментах к нему.


vegarulez   (2011-12-29 02:18:00) [10]

2 KilkennyCat ©   (29.12.11 02:10) [3]
FreeOnTerminate:=True
По идее же должен очиститься?

2 RWolf ©   (29.12.11 02:11) [4]
Waitfor вообще ощибку выдает - Tthread Error: Неверный дескриптор (6)

2 Германн ©   (29.12.11 02:12) [5]
Подскажите пожалуйста как очистить указатель на экземпляр?


Германн   (2011-12-29 02:14:00) [11]


>  vegarulez   (29.12.11 02:09) [2]
>
> а как тогда потом указатель очистить?
>

А зачем вмешиваться со своими вопросами в чужой топик?


Германн   (2011-12-29 02:12:00) [12]


> Но TPotok_Com - почему то Assigned
>

А почему и с какого перепугу он должен  быть не Assigned?
Ну когда же вы начнёте читать? Хотя бы учебники.
Free всего лишь отвечает за освобождение памяти, которую занял экземпляр класса. А функция Assigned всего лишь проверяет на ноль/nil указатель на тот самый экземпляр. А кто её будет обнулять? Пушкин или Гоголь?


RWolf   (2011-12-29 02:11:00) [13]

после возврата из WaitFor поток, очевидно, прекратил своё выполнение, вне зависимости от того, уничтожен его объект или нет.


KilkennyCat   (2011-12-29 02:10:00) [14]


> И он его соответсвенно заново не создаёт

конечно. он же не уничтожен. уничтожить - Free (полезно прочитать еще про FreeOnTerminate)
> Мастера, подскажите что делаю не так?

что обычно - не прочитал справку.


vegarulez   (2011-12-29 02:09:00) [15]

а как тогда потом указатель очистить?

мне же надо убедится что он действительно убит? чтобы второй такой же не создать? или я неправ?


RWolf   (2011-12-29 02:07:00) [16]

Assigned — это всего лишь проверка указателя на <>nil.
При уничтожении объекта указатель на него не обнуляется, так что условие не сработает.
Поток останавливают так:


thread.Terminate; //предлагаем потоку остановиться
thread.WaitFor;    //ждём, пока поток соизволит отреагировать


Наверх

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