Как получить доступ к "NameThreadForDebugging" в Delphi 2010

StackOverflow https://stackoverflow.com/questions/1487171

  •  18-09-2019
  •  | 
  •  

Вопрос

Как мне получить доступ к 'NameThreadForDebugging' в потоке delphi в Delphi 2010?

type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
    procedure UpdateCaption;
  end;

implementation

procedure TMyThread.UpdateCaption;
begin
  Form1.Caption := 'Name Thread For Debugging'; 
  // how I get 'TestThread1' displayed in the caption  
end;


procedure TMyThread.Execute;
begin
  NameThreadForDebugging('TestThread1');
  Synchronize(UpdateCaption); 
  Sleep(5000);
end;
Это было полезно?

Решение

Тот самый NameThreadForDebugging функция, как следует из ее названия, предназначена только для отладки.Если вы хотите отслеживать имя для других целей, то зарезервируйте поле в объекте thread и сохраните там имя.Используйте это поле для присвоения имени потоку и для заполнения заголовка вашей формы по запросу.

Не существует API для получения имени потока, потому что потоки не имеют имен на уровне API. NameThreadForDebugging вызывает специальное исключение, которое IDE распознает как исключение "назовите этот поток".Он видит исключение (поскольку это отладчик), делает пометку об имени потока в своих собственных внутренних структурах данных отладки, а затем разрешает приложению продолжить работу.Приложение улавливает и игнорирует исключение.

Однако эта передача данных является односторонней.Приложение может отправлять информацию в отладчик через исключение, но отладчик не может отправлять данные обратно.А ОПЕРАЦИОННАЯ система ни на что не обращает внимания.Для операционной системы это такое же исключение, как и любое другое.

Другие советы

Чтобы сделать то, что вы просите, вам нужно сохранить Имя внутри класса потока, где вы сможете получить к нему доступ, например:

type
  TMyThread = class(TThread)
  protected
    FName: String;
    procedure Execute; override;
    procedure UpdateCaption;
  end;

procedure TMyThread.UpdateCaption;
begin
  Form1.Caption := FName; 
end;

procedure TMyThread.Execute;
begin
  FName := 'TestThread1';
  NameThreadForDebugging(FName);
  Synchronize(UpdateCaption); 
  Sleep(5000);
end;

Модуль DebugThreadSupport в примере Code Central ИДЕНТИФИКАТОР:21893, Именованные трубы, показывает, как задать имя потока в старых версиях Delphi.

AFAICS Delphi поддерживает настройку только имени.Вам придется вызвать некоторую функцию Windows API, чтобы получить имя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top