Форум: "Начинающим";
Текущий архив: 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