![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]Да.