Форум: "Основная";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c