欢迎光临
我们一直在努力

可精确到1毫秒的用以在记录文件中写入自定义的调试信息(主要是时间)的组件-.NET教程,组件控件开发

建站超值云服务器,限时71元/月

上次我发布了一个用以在记录文件中写入自定义的调试信息(主要是时间)的组件,但由于clr的限制,它只能精确到10毫秒左右。后来我参考了网络上的一篇文章:http://blog.joycode.com/lostinet/archive/2005/04/24/49590.aspx(在这里首先向原作者表示感谢)通过调用系统api得到了可精确到1毫秒左右的时间记录。故特重新用c#重写了这个组件,与大家共享。

//====================================================================
//tracespy – 用以在记录文件中写入自定义的调试信息(开发者:林健)
//====================================================================
//
//属性:
//       tracefilename        – 记录文件名
//
//方法:
//   ★文本写入方面
//       writetext            – 写入自定义文本
//       clearalltext         – 清除所有文本
//   ★时间记录方面
//       settimepoint         – 设置时间起点
//       gettimespanfrominit  – 询问时间跨度(距离时间起点)
//       gettimespanfromprev  – 询问时间跨度(距离上次询问时间)
//   ★自定义计数器
//       setcounter           – 设置自定义计数器
//       addcounter           – 累加自定义计数器
//
//====================================================================

using system;

namespace tracespy
{
    public class thetrace
    {

        //记录文件名
        static public string tracefilename = “trace.txt”;

        //时间起点(初始为当前时刻)
        static private long inittimepoint = timecounter.getexactnow().ticks;

        //上次询问时间点(初始为当前时刻)
        static private long prevtimepoint = timecounter.getexactnow().ticks;

        //自定义计数器
        static private int counter = 0;

        //写入自定义文本
        static public void writetext(string str)
        {
            writetext(str, false);
        }

        static public void writetext(string str, bool showtime)
        {
            filewriter.writetext(str, showtime);
        }

        //清除所有文本
        static public void clearalltext()
        {
             filewriter.clearalltext();
        }

        //设置时间起点
        static public void settimepoint()
        {
             settimepoint(“”);
        }

        static public void settimepoint(string note)
        {
            inittimepoint = timecounter.getexactnow().ticks;
            prevtimepoint = timecounter.getexactnow().ticks;
            filewriter.writetext(“设置时间起点[” + note + “]。”, false);
        }

        //询问时间跨度(距离时间起点)
        static public decimal gettimespanfrominit()
        {
            return gettimespanfrominit(“”);
        }

        static public decimal gettimespanfrominit(string note)
        {
            prevtimepoint = timecounter.getexactnow().ticks;
            decimal span;
            span = (decimal)(prevtimepoint – inittimepoint) / (decimal)10000;
            filewriter.writetext(“询问时间跨度[” + note + “],距离时间起点为” + span.tostring() + “毫秒。”, false);
            return span;
        }

        //询问时间跨度(距离上次询问时间)
        static public decimal gettimespanfromprev()
        {
            return gettimespanfromprev(“”);
        }

        static public decimal gettimespanfromprev(string note)
        {
            long recttimepoint =timecounter.getexactnow().ticks;
            decimal span;
            span = (decimal)(recttimepoint – prevtimepoint) / (decimal)10000;
            prevtimepoint = recttimepoint;
            filewriter.writetext(“询问时间跨度[” + note + “],距离上次询问时间为” + span.tostring() + “毫秒。”, false);
            return span;
        }

        //设置自定义计数器
        static public int setcounter()
        {
            return setcounter(0);
        }
        static public int setcounter(int num)
        {
            counter = num;
            filewriter.writetext(“自定义计数器值设置为” + counter + “。”, false);
            return counter;
        }
        
        //累加自定义计数器
        static public int addcounter()
        {
            return addcounter(1);
        }
        static public int addcounter(int num)
        {
            counter += num;
            filewriter.writetext(“自定义计数器值累加到” + counter + “。”, false);
            return counter;
        }
    }
}

using system;
using system.runtime.interopservices;

namespace tracespy
{
    internal class timecounter
    {
        [dllimport(“kernel32.dll”)]
        static extern bool queryperformancecounter([in, out] ref long lpperformancecount);
        [dllimport(“kernel32.dll”)]
        static extern bool queryperformancefrequency([in, out] ref long lpfrequency);

        static long _f = 0;

        static private long gettickcount()
        {
            long f = _f;
            if (f == 0)
            {
                if (queryperformancefrequency(ref f))
                {
                    _f = f;
                }
                else
                {
                    _f = -1;
                }
            }
            if (f == -1)
            {
                return environment.tickcount * 10000;
            }
            long c = 0;
            queryperformancecounter(ref c);
            return (long)(((double)c) * 1000 * 10000 / ((double)f));
        }

        static long _tc = 0;

        static internal datetime getexactnow()
        {
            if (_tc == 0)
            {
                long tc = gettickcount();
                datetime dt = datetime.now;
                _tc = dt.ticks – tc;
                return dt;
            }
            return new datetime(_tc + gettickcount());
        }
    }
}

using system;

namespace tracespy
{
    internal class filewriter
    {
        static private system.io.streamwriter writer;

        //向文件中写入一个字串
        static internal void writetext(string str, bool showtime)
        {
            if(thetrace.tracefilename == string.empty)
                return;
            writer = new system.io.streamwriter(thetrace.tracefilename, true, system.text.encoding.default);
            string words;
            words = str;
            if(showtime)
                words += ” @ ” + timecounter.getexactnow().tolongdatestring() + ” ” + timecounter.getexactnow().tolongtimestring();
            writer.writeline(words);
            writer.close();
        }

        //清除记录文件
        static internal void clearalltext()
        {
            if(thetrace.tracefilename == string.empty)
                return;
            writer = new system.io.streamwriter(thetrace.tracefilename, false, system.text.encoding.default);
            writer.write(“”);
            writer.close();
        }
    }
}

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 可精确到1毫秒的用以在记录文件中写入自定义的调试信息(主要是时间)的组件-.NET教程,组件控件开发
分享到: 更多 (0)