加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:37:05 所属栏目:Java 来源:网络整理
导读:我想在Delphi 6 IDE中的线程列表窗口中显示一个很好的用户友好名称.我在网上找到了以下代码,因为据我所知,该版本没有本机实现的SetThreadName().我从我的线程的Execute()方法中调用它.我知道它被调用,因为在引发异常时IDE会弹出.但是,当我查看线程列表(Ctrl
我想在Delphi 6 IDE中的线程列表窗口中显示一个很好的用户友好名称.我在网上找到了以下代码,因为据我所知,该版本没有本机实现的SetThreadName().我从我的线程的Execute()方法中调用它.我知道它被调用,因为在引发异常时IDE会弹出.但是,当我查看线程列表(Ctrl Alt T)时,我看不到我设置的名称.我只看到通常的线程ID,状态,状态和位置列,没有别的.

为了获得线程名称,我需要做些什么?另外,有没有人知道如何阻止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,SizeOf(info) div SizeOf(LongWord),PDWord(@info));
    except
    end;
end;

解决方法

我找到了 the original code

它是特定于应用程序的异常(这意味着它特定于Visual C编译器).我认为没有理由为什么Delphi应该支持这个奇怪的功能(虽然它是可能的).

编辑:但它的工作原理! (感谢Remy Lebeau)

刚刚在Delphi XE上测试过(我在调试器’Thread status’窗口中看到’哇!’):

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,PDWord(@info));
    except
    end;
end;

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

end.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读