Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.059 c
15-1333905177
U+
2012-04-08 21:12
2013.03.22
Как подключить модуль через IN?


2-1335688376
SiDimka
2012-04-29 12:32
2013.03.22
Checkboxes DBGridEh 3.6


15-1334583721
Андреевич
2012-04-16 17:42
2013.03.22
Узнать когда был выход из ждущего режима


15-1348061625
xayam
2012-09-19 17:33
2013.03.22
Демонстрационное оборудование


15-1320615494
Kerk
2011-11-07 00:38
2013.03.22
Подсветка синтаксиса кода на форуме в Firefox и Chrome (beta)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский