中の技術日誌
 

わんくまライブラリ Wankuma.Interop.InteropQueryPerformanceCounterクラス Version2

2005/07/20

この文書はVisual Studio 2003(.NET1.1)をベースに記述されています。それ以降のバージョンや、あなたが読んでいる時点では変更されている可能性があります。
またバージョンアップされている場合にはなんらかかの不具合を含んでいる可能性があります。

ドキュメントへ
Wankuma.Interop.InteropQueryPerformanceCounter2d.htm

ソースファイル直接ダウンロードへ
Wankuma.Interop.InteropQueryPerformanceCounter2c.txt

利用規約へ
../kiyaku.htm

#region Using
using System;
using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;
#endregion

namespace Wankuma.Interop
{
  /// <summary>
  /// QueryPerformanceCounter を使ったパフォーマンスカウンタです。
  /// </summary>
  [SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
  public class InteropQueryPerformanceCounter
  {
    #region P/Invoke
    /// <summary>
    /// P/Invokeネイティブメソッド
    /// </summary>
    private sealed class NativeMethods
    {
      /// <summary>
      /// インスタンス化防止コンストラクタ
      /// </summary>
      private NativeMethods()
      {
      }
      /// <summary>
      /// 高分解能パフォーマンスカウンタが存在する場合、そのカウンタの現在の値を取得します。
      /// </summary>
      /// <param name="lpPerformanceCount">1 個の変数へのポインタを指定します。関数から制御が返ると、この変数に、高分解能パフォーマンスカウンタの現在の値が格納されます。インストール先のハードウェアが高分解能パフォーマンスカウンタをサポートしていない場合、この変数に 0 が格納されることがあります。</param>
      /// <returns>インストール先のハードウェアが高分解能パフォーマンスカウンタをサポートしている場合、0 以外の値が返ります。関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、GetLastError 関数を使います。たとえば、インストール先のハードウェアが高分解能パフォーマンスカウンタをサポートしていない場合、この関数は失敗します。</returns>
      [DllImport("kernel32.dll")]
      [SuppressUnmanagedCodeSecurity]
      public extern static int QueryPerformanceCounter(ref long lpPerformanceCount);
      /// <summary>
      /// 高分解能パフォーマンスカウンタが存在する場合、そのカウンタの周波数(更新頻度)を取得します。システムが動作している間は、周波数を変更できません。
      /// </summary>
      /// <param name="lpFrequency"> 個の変数へのポインタを指定します。関数から制御が返ると、この変数に、高分解能パフォーマンスカウンタの周波数が格納されます。周波数は、1 秒あたりのカウント数として表現されます。インストール先のハードウェアが高分解能パフォーマンスカウンタをサポートしていない場合、この変数に 0 が格納されることがあります。 </param>
      /// <returns>ハードウェアが高分解能パフォーマンスカウンタをサポートしている場合は、0 以外の値が返ります。関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、GetLastError 関数を使います。たとえば、インストール先のハードウェアが高分解能パフォーマンスカウンタをサポートしていない場合、この関数は失敗します。</returns>
      [DllImport("kernel32.dll")]
      [SuppressUnmanagedCodeSecurity]
      public extern static int QueryPerformanceFrequency(ref long lpFrequency);
    }
    #endregion
    #region メンバ
    private long _StratTime = 0;
    private long _EndTime = 0;
    private long _Frequency = 0;
    #endregion
    #region public long Frequency
    /// <summary>
    /// 分解能を取得します。
    /// </summary>
    /// <exception cref="NotSupportedException">このシステムではQueryPerformanceCounterが対応していません。</exception>
    public long Frequency
    {
      get
      {
        if (this._Frequency != 0 )
        {
          return this._Frequency;
        }
        else
        {
          if ( NativeMethods.QueryPerformanceFrequency(ref this._Frequency) == 0 )
          {
            throw new NotSupportedException("このシステムでは対応していません。");
          }
          else
          {
            return this._Frequency;
          }
        }
      }
      
    }
    #endregion
    #region public void Start()
    /// <summary>
    /// 計測を開始します
    /// </summary>
    /// <exception cref="NotSupportedException">このシステムではQueryPerformanceCounterが対応していません。</exception>
    public void Start()
    {
      if ( NativeMethods.QueryPerformanceCounter(ref this._StratTime) == 0 )
      {
        throw new NotSupportedException("このシステムでは対応していません。");
      }
    }
    #endregion
    #region public void End()
    /// <summary>
    /// 計測を終了します
    /// </summary>
    /// <exception cref="NotSupportedException">このシステムではQueryPerformanceCounterが対応していません。</exception>
    public void End()
    {
      if ( NativeMethods.QueryPerformanceCounter(ref this._EndTime) == 0 )
      {
        throw new NotSupportedException("このシステムでは対応していません。");
      }
    }
    #endregion
    #region public double Result
    /// <summary>
    /// Start()で計測を開始し、End()までの計測結果を返します。
    /// </summary>
    /// <exception cref="NotSupportedException">このシステムではQueryPerformanceCounterが対応していません。</exception>
    public double Result
    {
      get
      {
        return (this._EndTime - this._StratTime) * 1.0f / (double)this.Frequency;
      }
    }
    #endregion
    #region public double NowResult
    /// <summary>
    /// Start()で計測を開始し、現在時点での計測結果を返します
    /// </summary>
    /// <exception cref="NotSupportedException">このシステムではQueryPerformanceCounterが対応していません。</exception>
    public double NowResult
    {
      get
      {
        long NowTime = 0;
        if ( NativeMethods.QueryPerformanceCounter(ref NowTime) == 0 )
        {
          throw new NotSupportedException("このシステムでは対応していません。");
        }
        return (NowTime - this._StratTime) * 1.0f / (double)this.Frequency;
      }
    }
    #endregion
  }
}

勉強会: 05/18 大阪 登録受付中

中の技術日誌
コンテンツ
わんくま同盟
わんくま同盟
わんくま同盟
広告
バナー
MVP LOGO
MSMVP Visual C# Since 2004/04-2007/03
MCP LOGO
070-316
姉妹サイト
姉妹サイト:じゃんぬのC#, VB.NET 入門
じゃんぬの
C#, VB.NET 入門
検索
Google

ブログ本家
広告