CodeSite类别和线程

时间:2011-10-07 12:00:58

标签: multithreading delphi logging delphi-xe codesite

我正在尝试捆绑到Delphi XE中的CodeSite Express。我想使用Category这样的功能:

CodeSite.Category := 'SomeCategory';
CodeSite.EnterMethod ('SomeMethod');
try
  DoSomething;
finally
  CodeSite.ExitMethod ('SomeMethod');
end;

问题在于,如果DoSomething包含设置类别的日志记录代码,那么ExitMethod将会以不同的类别结束,并会在查看器中炸毁整个层次结构。

更糟糕的是,如果线程插入:设置Category然后调用日志命令显然不是原子操作,因此使用CodeSite日志记录的两个线程无法真正使用Category。至少这就是我在日志中的样子。我原以为Category是线程局部的,但似乎不是。

在嵌套日志记录和线程的上下文中处理类别的正确模式是什么?

谢谢!

1 个答案:

答案 0 :(得分:6)

创建另一个Codesite对象,可能每个线程对应一个,并设置该对象类别。

有多种方法可以做到这一点。你可以拥有一个特定的对象,比如MyThreadCodesite:TCodeSite;你写的,或者你可以为线程定义一个名为“Codesite”的属性并引用该对象。因此,您的线程代码看起来完全相同,因为它表示“Codesite.Send('hello');”但引用线程的对象。

一旦完成,这种方法很有效。我在一个项目中有大约十个TCodesite对象,着色可以让你看到系统的哪个部分很容易做到。