OSDN Git Service

文字列テクスチャクラスで文字列が表示されないバグを修正。
[strokestylet/CsWin10Desktop3.git] / FDK24 / Log.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4
5 namespace FDK
6 {
7         public class Log
8         {
9                 /// <summary>
10                 /// これを設定しておくと、スレッドID の横に "(<名前>)" と出力されるようになる。
11                 /// </summary>
12                 public static void 現在のスレッドに名前をつける( string 名前 )
13                 {
14                         var ID = Log.GetCurrentThreadId();
15
16                         if( Log.IDto名前.ContainsKey( ID ) )
17                                 Log.IDto名前.Remove( ID );
18
19                         Log.IDto名前.Add( ID, 名前 );
20                 }
21
22                 public static void Info( string 出力 )
23                 {
24                         Log.一定時間が経過していたら区切り線を表示する();
25                         Trace.TraceInformation( $"{Log.日時とスレッドID}{Log.インデックスを返す(Log.深さ)}{出力}" );
26                 }
27                 public static void ERROR( string 出力 )
28                 {
29                         Log.一定時間が経過していたら区切り線を表示する();
30                         Trace.TraceError( $"{Log.日時とスレッドID} {出力}" );
31                 }
32                 public static void WARNING( string 出力 )
33                 {
34                         Log.一定時間が経過していたら区切り線を表示する();
35                         Trace.TraceWarning( $"{Log.日時とスレッドID} {出力}" );
36                 }
37                 public static void BeginInfo( string 開始ブロック名 )
38                 {
39                         Log.一定時間が経過していたら区切り線を表示する();
40                         Trace.TraceInformation( $"{Log.日時とスレッドID}{Log.インデックスを返す( Log.深さ )}{開始ブロック名} --> 開始" );
41
42                         Log.深さ++;
43                 }
44                 public static void EndInfo( string 終了ブロック名 )
45                 {
46                         Log.深さ = Math.Max( --Log.深さ, 0 );
47
48                         Log.一定時間が経過していたら区切り線を表示する();
49                         Trace.TraceInformation( $"{Log.日時とスレッドID}{Log.インデックスを返す( Log.深さ )}{終了ブロック名} <-- 終了" );
50                 }
51
52                 /// <summary>
53                 /// 連続して呼び出しても、前回の同一識別キーでの表示から一定時間が経たないと表示しないInfoメソッド。
54                 /// </summary>
55                 /// <remarks>
56                 /// 毎秒60回の進行描画の進捗など、連続して呼び出すと膨大な数のログが出力されてしまう場合に使用する。
57                 /// </remarks>
58                 /// <param name="識別キー"></param>
59                 /// <param name="出力"></param>
60                 public static void 定間隔Info( string 識別キー, string 出力, double 間隔sec = 0.25 )
61                 {
62                         if( Log.識別キー別最終表示時刻.ContainsKey( 識別キー ) )
63                         {
64                                 if( ( DateTime.Now - Log.識別キー別最終表示時刻[ 識別キー ] ).TotalSeconds >= 間隔sec )
65                                 {
66                                         Log.識別キー別最終表示時刻[ 識別キー ] = DateTime.Now;
67                                         Trace.TraceInformation( $"{Log.日時とスレッドID} {出力}" );
68                                 }
69                         }
70                         else
71                         {
72                                 Log.識別キー別最終表示時刻.Add( 識別キー, DateTime.Now );
73                                 Trace.TraceInformation( $"{Log.日時とスレッドID} {出力}" );
74                         }
75                 }
76
77                 private static string 日時とスレッドID
78                 {
79                         get
80                         {
81                                 var NETスレッドID = System.Threading.Thread.CurrentThread.ManagedThreadId;
82                                 var Win32スレッドID = Log.GetCurrentThreadId();
83                                 var スレッド識別文字列 = ( Log.IDto名前.ContainsKey( Win32スレッドID ) ) ? $"({Log.IDto名前[ Win32スレッドID ]})" : "";
84                                 return $"{DateTime.Now.ToLongTimeString()} [{NETスレッドID:00},0x{Win32スレッドID:x}{スレッド識別文字列}]";
85                         }
86                 }
87                 private static readonly Dictionary<uint, string> IDto名前 = new Dictionary<uint, string>();
88                 private static Dictionary<string, DateTime> 識別キー別最終表示時刻 = new Dictionary<string, DateTime>();
89                 private static TimeSpan 経過時間
90                 {
91                         get
92                         {
93                                 var 現在時刻 = DateTime.Now;
94                                 var 経過時間 = 現在時刻 - Log.最終表示時刻;
95                                 Log.最終表示時刻 = 現在時刻;  // 更新
96                                 return 経過時間;
97                         }
98                 }
99                 private static DateTime 最終表示時刻 = DateTime.Now;
100                 private const double 最小区切り時間 = 2.0; // 区切り線を入れる最小の間隔[秒]。
101                 private static int 深さ = 0;
102
103                 private static void 一定時間が経過していたら区切り線を表示する()
104                 {
105                         if( Log.最小区切り時間 < Log.経過時間.TotalSeconds )
106                                 Trace.TraceInformation( "・・・" );
107                 }
108                 private static string インデックスを返す( int 長さ )
109                 {
110                         string index = " ";
111                         int len = 長さ * 2;
112                         while( 0 < len )
113                         {
114                                 index += "          ".Substring( 0, Math.Min( len, 10 ) );
115                                 len -= 10;
116                         }
117                         return index;
118                 }
119
120                 #region " Win32 API "
121                 //-----------------
122                 [System.Runtime.InteropServices.DllImport( "kernel32.dll" )]
123                 private static extern uint GetCurrentThreadId();
124                 //-----------------
125                 #endregion
126         }
127 }