![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TThread
tester2012 © (2012-04-19 22:47:00)пытаюсь разобраться с потоками:
constructor TTimerThread.Create;
begin
inherited Create(true);
FreeOnTerminate:=true;
Priority:=tpNormal;
end;
procedure TTimerThread.Execute;
begin
sleep(2000);
end;
.....
mainTimeThread:= TTimerThread.Create;
mainTimeThread.Resume;
sleep(3000);
насколько понял, указав FreeOnTerminate:=true; после выполнения execute память потока этого должна освободиться.
как узнать что поток отработал? думал что будет = nil ан нет.
после того как явно поток отработал проверяю Assigned(mainTimeThread) возвращает истину, и почему-то можно прочитать переменные этого потока без вылета access.
и второй вопрос, если в Execute тупо поставить sleep можно ли прервать этот потока пока не отработает слип? mainTimeThread.Terminate?
Anatoly Podgoretsky (2012-04-20 06:42:00) [1]
> Это случайно.
Это не случайно - это в рубашке родился.
Anatoly Podgoretsky (2012-04-20 06:40:00) [2]
> да вот для того и узнать, отработал поток или нет что бы
> второй раз не запускать.
Тебе надо именно не запускать второй раз, или что можно переменную повторно использовать.
1. Сам запуск потока и есть знание, что больше запускать не надо.
2. Работать вообще без переменной, и соблазна не будет повторно использовать переменную.
зы: Есть такая штука как TThreadList
Anatoly Podgoretsky (2012-04-20 06:37:00) [3]
with TTimerThread.Create do
begin
Resume;
end
Где здесь переменная, а Sender есть.
Юрий Зотов (2012-04-20 00:14:00) [4]
> но попробуй я обратитья к другому объекту, которы уничтожился.
> а тут вроде бы прокатывает
Это случайно. Такое может быть с любым объектом, не только с потоком.
tester2012 (2012-04-20 00:12:00) [5]я про то, что если объявить:
TTimerThread = class(TTHread)
publick
endTime: TTime;
..
после того, как поток отработал и самоуничтожился я все таки без ошибки обращаюсь к mainTimeThread.endTime это меня и смутило..
спасибо вообщем! примерно становится понятно...
Юрий Зотов (2012-04-20 00:09:00) [6]> и как же узнать по Sender какой именно поток?
Этот самый Sender и есть поток.
> мне, пишущему обработчик, что полезного в Sender?
Например, поток обработал какие-то данные и получил результаты. Перед его уничтожением надо "забрать" у него эти результаты.
> а тут вроде бы поток самоуничтожился, но тем временем обращаюсь
> к объявленным переменным потока и результат возвращается.
Объект уничтожился. А переменная, которая хранила его адрес - с какой стати она должна измениться? Ее же никто не менял.
tester2012 (2012-04-20 00:06:00) [7]Юрий Зотов ©, с адресами примерно стало понятно.. ))
но попробуй я обратитья к другому объекту, которы уничтожился.. а тут вроде бы прокатывает
))
спасибо!
Юрий Зотов (2012-04-20 00:04:00) [8]
> Сергей М. © (19.04.12 23:52) [6]
Бывает нужно - например, если в главном потоке надо определить, завершился ли дополнительный, или еще работает.
tester2012 (2012-04-20 00:03:00) [9]>> зачем тут тогда Sender
>Чтобы обработчик знал, какой именно поток завершается. Ведь он может обрабатывать сколько угодно потоков.
и как же узнать по Sender какой именно поток? мне, пишущему обработчик, что полезного в Sender?
>Накой шиш тебе вообще указатель понадобился
да вот для того и узнать, отработал поток или нет что бы второй раз не запускать.
по-большому, логичнее было бы при самоуничтожении и указатель в nil ставить.
а тут вроде бы поток самоуничтожился, но тем временем обращаюсь к объявленным переменным потока и результат возвращается..
немножко запутанно для новичка.
буду разбираться..
Юрий Зотов (2012-04-20 00:00:00) [10]
> tester2012 (19.04.12 23:36) [4]
Чтобы стало ясно. Живет человек, его адрес записан в записных книжках у 100 людей, причем сам человек об этих записях даже и не знает. Человек умер - что стало с записями?
Ничего. Их же никто не стирал.
Есть объект. Его адрес записан в 100 переменных, причем сам объект об этих переменных даже и не знает. Объект уничтожили - что стало с переменными?
Ничего. Их же никто не менял.
Юрий Зотов (2012-04-19 23:52:00) [11]> этот обработчик может принадлежать потоку?
Может, только вызван он будет все равно в основном потоке. Проще сделать этот обработчик там, где доступна переменная mainTimeThread - там же еее и обнулять.
> Sender это мой же поток?
Да. Но это не mainTimeThread, это другая переменная. Поэтому обнулять ее можно, но бесполезно.
> проверяю в приложении не nil
А почему переменная mainTimeThread должна измениться, если ее никто не менял?
> понимаю что наверное нужно mainTimeThread:= nil;
Правильно понимаете.
> но если у меня их десяток будет
Заведите список вместо одной переменной.
> зачем тут тогда Sender
Чтобы обработчик знал, какой именно поток завершается. Ведь он может обрабатывать сколько угодно потоков.
Сергей М. (2012-04-19 23:52:00) [12]
> tester2012 (19.04.12 23:36) [4]
Накой шиш тебе вообщеуказатель понадобился, если ты даешь команду потоку самому себя уничтожать ?
tester2012 (2012-04-19 23:36:00) [13]в процедуру входит, только не могу понять а кто тут Sender?
procedure OnMyThreadTerminate(Sender: TObject);
begin
sender:= nil;
end;
понимаю что наверное нужно mainTimeThread:= nil;
но если у меня их десяток будет..
зачем тут тогда Sender...
я так понимаю наверное в create прийдется передавать указатель на этот поток и в завершении execute этот указать в nil ставить.
можно ли так обнулить указатель в конце execute?
tester2012 (2012-04-19 23:23:00) [14]этот обработчик может принадлежать потоку?
constructor TTimerThread.Create
begin
inherited Create(true);
OnTerminate:= OnMyThreadTerminate;
...
procedure TTimerThread.OnMyThreadTerminate(Sender: TObject);
begin
sender:= nil;
end;
не работает.. я так понимаю Sender это мой же поток?
проверяю в приложении не nil
Юрий Зотов (2012-04-19 23:09:00) [15]
> tester2012
Обнуляйте в обработчике OnTerminate.
tester2012 (2012-04-19 23:06:00) [16]procedure TTimerThread.Execute;
begin
sleep(2000);
free;
как тут можно указателю присвоить ещё nil ?
end;