Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

TThread   Найти похожие ветки 

 
tester2012   (2012-04-19 22:47) [0]

пытаюсь разобраться с потоками:

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?


 
tester2012   (2012-04-19 23:06) [1]

procedure TTimerThread.Execute;
begin
 sleep(2000);
 free;

 как тут можно указателю присвоить ещё nil ?

end;


 
Юрий Зотов ©   (2012-04-19 23:09) [2]


> tester2012  

Обнуляйте в обработчике OnTerminate.


 
tester2012   (2012-04-19 23:23) [3]

этот обработчик может принадлежать потоку?

constructor TTimerThread.Create
begin
 inherited Create(true);
 OnTerminate:= OnMyThreadTerminate;
...

procedure TTimerThread.OnMyThreadTerminate(Sender: TObject);
begin
 sender:= nil;
end;

не работает..  я так понимаю Sender это мой же поток?
проверяю в приложении не nil


 
tester2012   (2012-04-19 23:36) [4]

в процедуру входит, только не могу понять а кто тут Sender?

procedure OnMyThreadTerminate(Sender: TObject);
begin
 sender:= nil;
end;

понимаю что наверное нужно mainTimeThread:= nil;
но если у меня их десяток будет..
зачем тут тогда Sender...

я так понимаю наверное в create прийдется передавать указатель на этот поток и в завершении execute этот указать в nil ставить.
можно ли так обнулить указатель в конце execute?


 
Юрий Зотов ©   (2012-04-19 23:52) [5]

> этот обработчик может принадлежать потоку?
Может, только вызван он будет все равно в основном потоке. Проще сделать этот обработчик там, где доступна переменная mainTimeThread - там же еее и обнулять.

> Sender это мой же поток?
Да. Но это не mainTimeThread, это другая переменная. Поэтому обнулять ее можно, но бесполезно.

> проверяю в приложении не nil
А почему переменная mainTimeThread должна измениться, если ее никто не менял?

> понимаю что наверное нужно mainTimeThread:= nil;
Правильно понимаете.

> но если у меня их десяток будет
Заведите список вместо одной переменной.

> зачем тут тогда Sender
Чтобы обработчик знал, какой именно поток завершается. Ведь он может обрабатывать сколько угодно потоков.


 
Сергей М. ©   (2012-04-19 23:52) [6]


> tester2012   (19.04.12 23:36) [4]


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


 
Юрий Зотов ©   (2012-04-20 00:00) [7]


> tester2012   (19.04.12 23:36) [4]

Чтобы стало ясно. Живет человек, его адрес записан в записных книжках у 100 людей, причем сам человек об этих записях даже и не знает. Человек умер - что стало с записями?

Ничего. Их же никто не стирал.

Есть объект. Его адрес записан в 100 переменных, причем сам объект об этих переменных даже и не знает. Объект уничтожили - что стало с переменными?

Ничего. Их же никто не менял.


 
tester2012   (2012-04-20 00:03) [8]

>> зачем тут тогда Sender
>Чтобы обработчик знал, какой именно поток завершается. Ведь он может обрабатывать сколько угодно потоков.

и как же узнать по Sender какой именно поток? мне, пишущему обработчик, что полезного в Sender?

>Накой шиш тебе вообще указатель понадобился
да вот для того и узнать, отработал поток или нет что бы второй раз не запускать.

по-большому, логичнее было бы при самоуничтожении и указатель в nil ставить.
а тут вроде бы поток самоуничтожился, но тем временем обращаюсь к объявленным переменным потока и результат возвращается..
немножко запутанно для новичка.
буду разбираться..


 
Юрий Зотов ©   (2012-04-20 00:04) [9]


> Сергей М. ©   (19.04.12 23:52) [6]

Бывает нужно - например, если в главном потоке надо определить, завершился ли дополнительный, или еще работает.


 
tester2012   (2012-04-20 00:06) [10]

Юрий Зотов ©, с адресами примерно стало понятно.. ))
но попробуй я обратитья к другому объекту, которы уничтожился.. а тут вроде бы прокатывает
))
спасибо!


 
Юрий Зотов ©   (2012-04-20 00:09) [11]

> и как же узнать по Sender какой именно поток?
Этот самый Sender и есть поток.

> мне, пишущему обработчик, что полезного в Sender?
Например, поток обработал какие-то данные и получил результаты. Перед его уничтожением надо "забрать" у него эти результаты.

> а тут вроде бы поток самоуничтожился, но тем временем обращаюсь
> к объявленным переменным потока и результат возвращается.

Объект уничтожился. А переменная, которая хранила его адрес - с какой стати она должна измениться? Ее же никто не менял.


 
tester2012   (2012-04-20 00:12) [12]

я про то, что если объявить:

   TTimerThread = class(TTHread)
    publick
       endTime: TTime;

..

после того, как поток отработал и самоуничтожился я все таки без ошибки обращаюсь к mainTimeThread.endTime  это меня и смутило..

спасибо вообщем! примерно становится понятно...


 
Юрий Зотов ©   (2012-04-20 00:14) [13]


> но попробуй я обратитья к другому объекту, которы уничтожился.
> а тут вроде бы прокатывает

Это случайно. Такое может быть с любым объектом, не только с потоком.


 
Anatoly Podgoretsky ©   (2012-04-20 06:37) [14]

with TTimerThread.Create do
begin
  Resume;
end

Где здесь переменная, а Sender есть.


 
Anatoly Podgoretsky ©   (2012-04-20 06:40) [15]


> да вот для того и узнать, отработал поток или нет что бы
> второй раз не запускать.

Тебе надо именно не запускать второй раз, или что можно переменную повторно использовать.

1. Сам запуск потока и есть знание, что больше запускать не надо.
2. Работать вообще без переменной, и соблазна не будет повторно использовать переменную.

зы: Есть такая штука как TThreadList


 
Anatoly Podgoretsky ©   (2012-04-20 06:42) [16]


> Это случайно.

Это не случайно - это в рубашке родился.



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.062 c
15-1345119186
stas
2012-08-16 16:13
2013.03.22
Расчет площади сложной фигуры


15-1350906196
Лида
2012-10-22 15:43
2013.03.22
Обработка различных событий в Delphi


15-1346322658
Артём
2012-08-30 14:30
2013.03.22
Как программно нажать на кнопку на сайте?


15-1339412694
NieL
2012-06-11 15:04
2013.03.22
ошибка xml


15-1351925332
LLLL
2012-11-03 10:48
2013.03.22
Странный вопрос о браузерах