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

标签 multithreading delphi exception

我希望在 Delphi 6 IDE 中的线程列表窗口中显示一个用户友好的名称。我在网上找到了下面的代码,用于在 Delphi 6 中执行此操作,因为据我所知,该版本没有本地实现 SetThreadName() 。我从线程的 Execute() 方法中调用它。我知道它正在被调用,因为当引发异常时 IDE 会弹出。但是,当我查看线程列表(Ctrl + Alt + T)时,我没有看到我设置的名称。我只看到常见的“线程 ID”、“状态”、“状态”和“位置”列,没有其他内容。

我需要做什么不同的事情才能显示线程名称?另外,有人知道如何阻止 IDE 在 RaiseException 行暂停吗?我的程序中有很多线程,每次运行程序时IDE都会弹出N次,这很烦人。
我知道我可以禁用 IDE 在出现 Delphi 异常时停止,但我希望正常情况下这样做,并且我不希望每次创建一组新线程时都必须将其关闭和打开。

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;

最佳答案

我找到了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.

关于multithreading - 这是在 Delphi 6 中设置线程名称的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9089973/

相关文章:

laravel - 在Laravel 5中处理TokenMismatchException

c - C程序中的多线程

c++ - 在 Python 中扩展的 C++ 类中的段错误回调问题

Delphi 操作管理器快捷键 +,-, enter 操作

delphi - 按需跳过通用参数

delphi - Delphi 中的电子邮件程序

c++ - 重新抛出指针捕获的异常

java - 读取两个(不同的)数字( float )组成的字符串。输出更大的数字。不要使用 “if”

multithreading - 一次调用ResetEvent是否会重置所有线程或仅调用线程的信号事件? (WINAPI)

c++ - QtConcurrent映射和进度报告