我想在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.