/// <summary> /// ウォッチドッグを止める /// </summary> /// <remarks> /// <para> /// このスレッド用のウォッチドッグ監視スレッドが破棄されます。 /// もしウォッチドッグを開始していない場合には何もしません。 /// ウォッチドッグ監視を繰り返し何度も行なう場合に都度StopWatchdogをする /// のは大きなCPU負荷になります。一時的にウォッチドッグがかからないよう /// にしたい場合は、SuspendWatchdog()を呼び出してください。 /// </para> /// </remarks> public static void StopWatchdog() { NThread nth = CurrentThread; if (nth != null) { nth.stopWatchdog(); } }
/// <summary> /// ウォッチドッグを一時停止する /// </summary> /// <remarks> /// <para> /// 内部的にはlong.MaxValueミリ秒のウォッチドッグを行なっているだけなの /// で、スレッド監視処理の負荷は減りません。 /// </para> /// </remarks> public static void SuspendWatchdog() { NThread nth = CurrentThread; if (nth != null) { nth.watchdog(long.MaxValue, WatchdogMode.Keep); } }
/// <summary> /// ウォッチドッグを開始する /// </summary> /// <param name="timeout">ウォッチドッグタイムアウト時間(ミリ秒)。省略または0以下を指定した時は以前の設定を継続する</param> /// <param name="mode">ウォッチドッグ発動時の動作。省略時は以前の設定を継続する</param> /// <remarks> /// <para> /// このスレッド用のウォッチドッグ用のスレッドが作成されて監視します。 /// ただし、すでにウォッチドッグスレッドが作成されている場合は、ウォッチ /// ドッグタイマのリセットだけを行なうことになります。 /// 同一スレッドで次にWatchdog / StopWatchdogが呼ばれる前にtimeoutミリ秒 /// が経過すると、modeで指定した動作が起こります。 /// タイムアウトでスレッドをAbortする際には、ExceptionStateに /// TimeoutExceptionオブジェクトがセットされます。 /// </para> /// </remarks> public static void Watchdog(int timeout = 0, WatchdogMode mode = WatchdogMode.Keep) { NThread nth = CurrentThread; if (nth != null) { nth.watchdog((long)timeout, mode); } }
private void _waitForStop(int timelimit) { if (mythread == null) { return; } StopRequest = true; mythread.Join(timelimit); mythread = null; }
/// <summary> /// 実行時間計測の準備をする /// </summary> /// <param name="writer_">計測結果を出力するときに使うTextWriter</param> public Measure(TextWriter writer_) { NThread nth = CurrentThread; if (nth == null) { throw new InvalidOperationException("Can't measure time outside NThread's thread"); } threadName = "[" + nth.Name + "]"; writer = writer_; }
/// <summary> /// 実行時間計測の準備をする /// </summary> /// <param name="logger_">計測結果を出力するときに使うLoggableオブジェクト</param> public Measure(Loggable logger_ = null) { NThread nth = CurrentThread; if (nth == null) { throw new InvalidOperationException("Can't measure time outside NThread's thread"); } threadName = "[" + nth.Name + "]"; logger = (logger_ ?? nth).Logger; }
/// <summary> /// スレッド動作を開始する /// </summary> /// <remarks> /// <para> /// 既に開始している場合は何もしない。 /// </para> /// </remarks> public void Start() { lock (threadMutex) { if (mythread != null) { return; } StopRequest = false; mythread = new NThread(name, Run); mythread.Start(); } }
/// <summary> /// NThreadの一覧を書き出す /// </summary> public static void DumpAll(TextWriter w) { NThread[] list; lock (threadDict) { list = new NThread[threadDict.Count]; threadDict.Values.CopyTo(list, 0); } Array.Sort(list, delegate(NThread a, NThread b){ return(a.Name.CompareTo(b.Name)); }); w.WriteLine("NThread: total {0} threads", list.Length); foreach (NThread nth in list) { nth.Dump(w); } }