我正在试验捆绑到 Delphi XE 中的 CodeSite Express。我想像这样使用 Category
功能:
CodeSite.Category := 'SomeCategory';
CodeSite.EnterMethod ('SomeMethod');
try
DoSomething;
finally
CodeSite.ExitMethod ('SomeMethod');
end;
问题是,如果 DoSomething
还包含设置类别的日志记录代码,那么 ExitMethod
将以不同的类别结束,并会破坏整个层次结构在查看器中。
如果线程启动,情况会更糟:设置 Category
然后调用日志命令显然不是原子操作,因此使用 CodeSite 日志记录的两个线程不能真正使用 Category
。至少在我的日志中是这样的。我原以为 Category
是线程本地的,但它似乎不是。
在嵌套日志记录和线程上下文中处理类别的正确模式是什么?
谢谢!
最佳答案
创建另一个 Codesite 对象,可能每个线程一个,并设置该对象类别。
有多种方法可以做到这一点。你可以有一个特定的对象,比如 MyThreadCodesite : TCodeSite;您写入的对象,或者您可以为称为“Codesite”的线程定义一个属性并引用该对象。因此你的线程代码看起来完全一样,因为它说“Codesite.Send('hello');”但引用线程的对象。
完成后效果很好。我在一个项目中有大约 10 个 TCodesite 对象,着色可以让您轻松查看系统的哪一部分在做什么。
关于multithreading - CodeSite 类别和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7686941/