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

Вниз

TThread.ThreadID - уникальность после завершения потока   Найти похожие ветки 

 
Nomad.kz   (2002-11-07 16:22) [0]

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


 
VaS ©   (2002-11-07 16:26) [1]

Да.


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

ThreadID? A razve on ne systemoj naznachaetsya?


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

Может


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

Да, назначается системой, при вызове 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 уникальныо все-таки?


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

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

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


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

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


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


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


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

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


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

хорошо, например, ситуация:
поток 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 18:35) [9]

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

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

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


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

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



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

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

Наверх




Память: 0.49 MB
Время: 0.02 c
3-59065
Max Zyuzin
2002-10-30 14:46
2002.11.18
Совет нужен


6-59310
EgnA
2002-09-23 11:36
2002.11.18
Как реализовать параметр в ActiveX


14-59351
F1
2002-10-29 14:24
2002.11.18
Проблема с NT Server


3-59077
Ag2002
2002-10-25 14:35
2002.11.18
подключение


14-59400
GUID
2002-10-30 19:16
2002.11.18
HELP!!!!! Proxy server for w2k professional