可精確到1毫秒的用以在記錄檔案中寫入自訂的調試資訊(主要是時間)的組件

來源:互聯網
上載者:User
上次我發布了一個用以在記錄檔案中寫入自訂的調試資訊(主要是時間)的組件,但由於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();
        }
    }
}


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。