Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TThread.ThreadID - уникальность после завершения потока [D5, Win95/98]


Nomad.kz ©   (2002-11-07 16:22:00) 

Кто-нибудь знает ответ по теме? Поясняю, если непонятно:
Имеем поток, который нормально (или ненормально, т.е. по Terminate, по исключению и т.д.) завершается, т.к. FreeOnTerminate:=true. Может ли у нового потока поле ThreadID проинициализироваться значением завершенного потока?


Alex4444444444   (2002-11-07 18:41:00) [1]

U Thread"a est" parameter, cotoryj VY zadaete. Ispol"zujte ego kak identificator.


Юрий Зотов   (2002-11-07 18:35:00) [2]

Это не мнение и не интуиция. Это знание.

Из справки:
The identifiers are valid from the time the thread is created until the thread has been terminated.

Из Рихтера:
После завершения потока или процесса его идентификатор может использоваться повторно для других потоков или процесов.


Nomad.kz   (2002-11-07 17:42:00) [3]

хорошо, например, ситуация:
поток th ужезавершился, обрабатывается его выходное сообщение. Новый поток уже создан, предположим, что он получил тот же ThreadID, что и th, тогда:

TCl:GetMsg(var Msg:Message);
begin
if bThActive and (th.ThreadID=cardinal(Msg,lParam)) then
bThActive:=false;
end;


и возникает ситуация, если обработка завершения второго потока произойдет быстрее, чем обработка первого (th). Или это надуманная ситуация и такого произойти не может в принципе?

2Игорь Шевченко ©
Вы уверены в своем мнении или это Ваша интуиция?


Игорь Шевченко   (2002-11-07 17:14:00) [4]


> if bThActiveand (th.ThreadID=cardinal(Msg,lParam)) then


Исходя из этой строки можно предположить, что поток все-таки активен...

Еще раз - после завершения потока уникальность ThreadId в системе не гарантирована.


Alex4444444444   (2002-11-07 16:57:00) [5]

Pardon za moj post, ya ne pravil"no ponyal pervonachal"nyj vopros.


Nomad.kz   (2002-11-07 16:46:00) [6]

Может быть во время существования потокавыделяемые потокам ThreadID уникальныо все-таки?

пардон, оговорился, во время существования процесса


Nomad.kz   (2002-11-07 16:44:00) [7]

Да, назначается системой, при вызове CreateThrread. Если после завершения потока ThreadID не уникально, то тогда непонятно, почему используется практика сравнения ThreadID после завершения потока, приведу пример:

TCl = class( TForm )
begin
th:TThread;
bThActive:boolean;

...
procedure GetMsg(var Msg:Message);message WM_USER+1;
end;

TCl:GetMsg(var Msg:Message);
begin
if bThActive and (th.ThreadID=cardinal(Msg,lParam)) then
...
end;


имхо, не факт то, что обработчик GetMsg выполнится до завершения потока, т.к. сообщение может быть послано при помощи PostMessage, а в деструкторе может выполняться еще что-нибудь, занимающее время (хотя бы ожидание дочернего потока данного потока). Может быть во время существования потока выделяемые потокам ThreadID уникальныо все-таки?


Игорь Шевченко   (2002-11-07 16:40:00) [8]

Может


Alex4444444444   (2002-11-07 16:34:00) [9]

ThreadID? A razve on ne systemoj naznachaetsya?


VaS   (2002-11-07 16:26:00) [10]

Да.


Наверх

Титульная страница Поиск, карта сайта Написать письмо