2011-10-07 83 views
2

我正在试验捆绑到Delphi XE中的CodeSite Express。我想用Category功能是这样的:CodeSite类别和线程

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

的问题是,如果DoSomething包含日志代码以及那台类别,比ExitMethod将在不同的类别结束,将炸毁整个层次在观众中。

更糟糕的是,如果线程开始:设置Category然后调用日志命令显然不是原子操作,所以使用CodeSite日志的两个线程不能真正使用Category。至少这就是它在我的日志中的样子。我本以为Category是线程本地的,但似乎没有。

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

谢谢!

回答

6

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

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

一旦你完成了这个工作就很好。我在一个项目中有大约10个TCodesite对象,着色允许您查看系统的哪个部分正在轻松做什么。

+0

+1谢谢!这很好。 – jpfollenius

+1

有趣。我们也在使用多个代码段对象。每个都记录到不同的文件。每个也必须支持多个类别。我们不愿意承担时间处罚,所以我们不锁定并且目前“遭受”有时出错的着色。由于我们可以拥有大量(大部分是休眠)线程,所以我不确定每个自己的代码库实例都可以为我们工作。特别是因为我们当前的codesite后代不使用调度程序,而是直接登录到文件。但看到你的答案给了我一些想法,我将追求...谢谢! –