Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.012 c
1-59115
Николай Быков
2002-11-08 00:09
2002.11.18
Object Inspector


3-59071
Bishop
2002-10-30 16:27
2002.11.18
ОРС


14-59379
Song
2002-10-30 11:18
2002.11.18
Прошу помощи тех, кто учится в МГУ и живёт в 3-ем корпусе общеж.


4-59479
Guest2002
2002-10-07 17:02
2002.11.18
Активация-деактивация


1-59198
AL2002
2002-11-06 12:37
2002.11.18
Прога, запущенная этим кодом, освободит память, когда завершится?




   Наверх