Rob*_*ler 7 delphi multithreading exception-handling
在Delphi 6 IDE中,我希望在线程列表窗口中显示一个很好的用户友好名称.我在网上找到了以下代码,因为据我所知,该版本没有本机实现的SetThreadName().我从我的线程的Execute()方法中调用它.我知道它正在调用,因为在引发Exception时会弹出IDE.但是,当我查看线程列表(Ctrl + Alt + T)时,我看不到我设置的名称.我只看到通常的线程ID,状态,状态和位置列,没有别的.
为了获得线程名称,我需要做些什么?另外,有没有人知道如何阻止IDE在RaiseException线上暂停?我在程序中有很多线程,每次运行程序时IDE都会弹出N次很烦人.
我知道我可以禁止IDE停止使用Delphi Exceptions,但我通常希望这样做,并且我不希望每次创建一组新线程时都必须关闭它.
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;
Run Code Online (Sandbox Code Playgroud)
我找到了原始代码
它是特定于应用程序的异常(这意味着它特定于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, 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.
Run Code Online (Sandbox Code Playgroud)
在C++ Builder 6和Delphi 7之后,File > New > Other > Thread Object向导可以选择在调试器中命名新线程.该向导生成一个存根TThread后代类RaiseException(),其Execute()方法顶部具有必要的实现.
这对Delphi 6没有任何帮助,但它还不支持线程命名.