Это правильный способ установить имя потока в Delphi 6? - PullRequest
7 голосов
/ 01 февраля 2012

Я хочу, чтобы в окне списка нитей в Delphi 6 IDE отображалось удобное имя, удобное для пользователя.Я нашел приведенный ниже код в Интернете для этого в Delphi 6, поскольку, насколько мне известно, в этой версии не реализована встроенная функция SetThreadName ().Я вызываю его из метода Execute () моего потока.Я знаю, что он вызывается, потому что IDE всплывает, когда возникает исключение.Однако, когда я просматриваю список потоков (Ctrl + Alt + T), я не вижу установленного имени.Я просто вижу обычные столбцы Thread Id, State, Status и Location, больше ничего.

Что мне нужно сделать по-другому, чтобы отобразить имена потоков?Кроме того, у кого-нибудь есть идеи о том, как остановить IDE от остановки в строке RaiseException?У меня много потоков в программе, и раздражает, что IDE появляется N раз при каждом запуске программы.
Я знаю, что могу отключить IDE при остановке Delphi Exceptions, но я хочу это нормально, и яЯ бы предпочел, чтобы вам не приходилось его выключать, и каждый раз при создании нового набора потоков.

Именованные потоки в Delphi - для чего это нужно?

procedure SetThreadName_delphi(const Name: string);
    type
      TThreadNameInfo =
        record
          RecType: LongWord;
          Name: PChar;
          ThreadID: LongWord;
          Flags: LongWord;
        end;
var
    info:TThreadNameInfo;
begin
    // This code is extremely strange, but it's the documented way of doing it!

    info.RecType := $1000;
    info.Name := PChar(Name);
    info.ThreadID := $FFFFFFFF;
    info.Flags := 0;

    try
        RaiseException($406D1388, 0,
        SizeOf(info) div SizeOf(LongWord), PDWord(@info));
    except
    end;
end;

Ответы [ 2 ]

6 голосов
/ 01 февраля 2012

Я нашел оригинальный код

Это специфичное для приложения исключение (это означает, что оно специфично для компилятора Visual C ++). Я не вижу причин, почему Delphi должен поддерживать эту странную функцию (хотя это возможно).


Редактировать : НО ЭТО РАБОТАЕТ! (Спасибо Реми Лебо)

Только что протестировано на Delphi XE (я вижу «Wow!» В окне «Состояние потока» отладчика):

unit NameTest;

interface

uses
  Windows, Classes;

type
  TTestThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

{ TTestThread }

procedure SetThreadName_delphi(const Name: string);
    type
      TThreadNameInfo =
        record
          RecType: LongWord;
          Name: PAnsiChar;
          ThreadID: LongWord;
          Flags: LongWord;
        end;
var
    info:TThreadNameInfo;
    AnsiName: AnsiString;

begin
    AnsiName:= Name;
    info.RecType := $1000;
    info.Name := PAnsiChar(AnsiName);
    info.ThreadID := $FFFFFFFF;
    info.Flags := 0;
    try
        RaiseException($406D1388, 0,
        SizeOf(info) div SizeOf(LongWord), PDWord(@info));
    except
    end;
end;

procedure TTestThread.Execute;
begin
  SetThreadName_delphi('Wow!');
  while not Terminated do
    Sleep(1000);
end;

end.
5 голосов
/ 01 февраля 2012

В C ++ Builder 6 и Delphi 7 и более поздних версиях у мастера File > New > Other > Thread Object есть возможность присвоения имени новому потоку в отладчике.Мастер создает класс-потомок TThread с необходимой реализацией RaiseException() в начале своего метода Execute().

Это не поможет в Delphi 6, который еще не поддерживал именование потоков.

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