【发布时间】:2014-06-14 03:46:49
【问题描述】:
最近我研究了一个高并发事件驱动框架(Java Akka),它将创建大量的Actor 线程。当我调试 Akka 应用程序时,线程具有非常有意义的名称。真是太棒了。当我切换回 Delphi 时,我对所有线程都未命名感到不安,尽管过去 20 年它们已经未命名了。
对于我自己设计的所有线程类,我遵循这样的模式,我定义了一个 setter SetThreadName 并在 Execute 方法中调用 NameThreadForDebugging。到目前为止,这工作正常。
type
TMyThread = class(TThread)
private
FThreadName: string;
protected
procedure Execute; override;
public
procedure SetThreadName(const ThreadName: string);
end;
procedure TMyThread.SetThreadName(const ThreadName: string);
begin
FThreadName := ThreadName;
end;
procedure TMyThread.Execute;
begin
NameThreadForDebugging(FThreadName);
// Put normal thread execution code here
end;
但那些第 3 方线程的实例将保持未命名,除非我创建下降线程类。是否有 Delphi Magic 将SetThreadName 设置为基线程类?我可以使用Detour.pas 来强制NameThreadForDebugging(FThreadName) 在Execute 方法的第一个位置被调用。
有什么想法吗?
更新 1 感谢 David 的热心帮助。为了帮助其他读者更好地理解我的问题,我对问题进行了巧妙的改写。
-
我的代码有什么问题?
NameThreadForDebugging方法实际上是一个静态方法。第二个参数ThreadId是可选的,默认等于当前线程id。如果我没有明确给出ThreadId,我很可能会命名为当前线程,而不是我真正想要命名的线程。 -
解决办法是什么?
在任何地方致电
MyThread.NameThreadForDebugging('a_name', MyThread.ThreadId);或在TMyThread.Execute的开头致电NameThreadForDebugging('a_name');。 -
为什么要把事情做对这么困惑?
我不明白,为什么不提供没有第二个
ThreadId的非静态版本。如果有这样的非静态版本,我就不会犯这个错误。
【问题讨论】:
-
什么是
FThreadName?不受您控制的第三方组件在哪里命名他们的线程?挂钩是最容易的部分。得到的名字不是那么多。 -
如果我提供
SetThreadName,它会为私有变量FThreadName设置一个名称。 -
我不明白最后的评论。谁将提供这些名称,以及将在什么时候提供。
-
关于你的编辑,绕道很容易。好吧,这当然是可能的,我们不要担心如何去做。虽然我不认为我会绕道
TThread,因为还有其他方法可以制作线程。我看不出谁会真正设置FThreadName。更不用说助手不能添加数据成员,只能添加方法。你似乎还没有理解我的意思。如果有人能够为线程提供名称,那么他们就可以直接调用NameThreadForDebugging。
标签: multithreading delphi debugging ide delphi-xe