Именованные темы в Delphi - для чего это нужно? - PullRequest
6 голосов
/ 05 октября 2010

Когда вы создаете потомка TThread, используя палитру инструментов в BDS, вы можете указать имя для потока. Вот автоматически сгенерированный код. Вы просто вызываете функцию SetName () в методе Execute, и потоку, вызывающему этот метод, присваивается какое-то странное имя ...

{$IFDEF MSWINDOWS}
type
  TThreadNameInfo = record
    FType: LongWord;     // must be 0x1000
    FName: PChar;        // pointer to name (in user address space)
    FThreadID: LongWord; // thread ID (-1 indicates caller thread)
    FFlags: LongWord;    // reserved for future use, must be zero
  end;
{$ENDIF}

{ TTestThread }

procedure TTestThread.SetName;
{$IFDEF MSWINDOWS}
var
  ThreadNameInfo: TThreadNameInfo;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
  ThreadNameInfo.FType := $1000;
  ThreadNameInfo.FName := 'ThreadName';
  ThreadNameInfo.FThreadID := $FFFFFFFF;
  ThreadNameInfo.FFlags := 0;

  try
    RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
  except
  end;
{$ENDIF}
end;

Я считаю, что это действительно полезно во время отладки, поскольку вы можете видеть не только TID, но и имена потоков, назначенные таким образом. Вы знаете, какая нить, какая благодаря этому.

Пожалуйста, скажите мне, если назначенное имя можно получить каким-либо образом. Можно ли читать на основе дескриптора потока? Или он может быть прочитан даже извне процесса другим процессом? Вы знаете, есть приложения, которые перечисляют ваши процессы и потоки, работающие в них. Будет ли это имя доступно для таких приложений?

Спасибо!

Ответы [ 2 ]

9 голосов
/ 05 октября 2010

На самом деле, имена потоков просто используются для целей отладки и ничего более, на самом деле.В вашем коде вы можете просто идентифицировать потоки, используя ThreadID.И если вы хотите сохранить имя с этими идентификаторами потоков, держите отдельный список (словарь), который сопоставляет каждый идентификатор потока с любым именем, которое вам нравится.Взлом, который вы видите, делает неприятный трюк.Возникающее исключение захватывается отладчиком, который просто обрабатывает его как специальное исключение и просто продолжит выполнение.Флаг исключения просто говорит системе продолжить после возникновения исключения, так как код будет обрабатывать его.Пустое предложение исключением обрабатывает исключение в вашем коде.Это просто грязная уловка для связи с отладчиком, который запишет исключение и запомнит только что переданное ему имя ...

6 голосов
/ 05 октября 2010

Это полностью функция отладки. Фактически, объект потока даже не отслеживает свое собственное имя. Он отправляет его непосредственно отладчику, но не хранит копию имени для себя. Он недоступен из вашей собственной программы или из других источников, кроме отладчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...