这是在Delphi 6中设置线程名称的正确方法吗?

时间:2012-02-01 02:36:42

标签: multithreading delphi exception-handling

我想在Delphi 6 IDE中的线程列表窗口中显示一个好的用户友好名称。我在网上找到了以下代码,因为据我所知,该版本没有本机实现的SetThreadName()。我从我的线程的Execute()方法中调用它。我知道它正在调用,因为在引发Exception时会弹出IDE。但是,当我查看线程列表(Ctrl + Alt + T)时,我看不到我设置的名称。我只看到通常的Thread Id,State,Status和Location列,没有别的。

我需要做些什么才能显示线程名称?另外,有没有人知道如何阻止IDE在RaiseException线上暂停?我在程序中有很多线程,每次运行程序时IDE都会弹出N次很烦人。
我知道我可以禁止IDE停止使用Delphi Exceptions,但我通常希望这样做,而且我不希望每次创建一组新线程时都关闭它。

Named threads in Delphi - what is that for?

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 个答案:

答案 0 :(得分:6)

我找到了the original code

这是一个特定于应用程序的异常(这意味着它特定于Visual C ++编译器)。我认为Delphi没有理由支持这个奇怪的功能(尽管有可能)。


编辑但是工作正常!(感谢Remy Lebeau)

刚刚在Delphi XE上测试过(我在调试器'线程状态'窗口中看到'哇!'):

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.

答案 1 :(得分:5)

在C ++ Builder 6和Delphi 7之后,File > New > Other > Thread Object向导可以选择在调试器中命名新线程。该向导生成一个存根TThread后代类,其RaiseException()方法顶部具有必要的Execute()实现。

但这对Delphi 6没有任何帮助,但它还不支持线程命名。