Как получить доступ к "NameThreadForDebugging" в Delphi 2010
-
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, чтобы получить имя.