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