none
timerコントロールについて RRS feed

  • 質問

  • はじめまして

    timerについてお聞きしたいのですが、

    hh:mm:ss 形式に 100分の1秒を追加表示したいのですが可能でしょうか?

     

    また不可能な場合、現在時刻を100分の1秒まで収得する方法はありますでしょうか?

     

    使用Ver.はVB 2008 Expressです。

     

    よろしくお願いいたします。

     

    2008年5月27日 10:25

回答

  • コロカンさん こんにちは。

    DateTime.Millisecondというプロパティがありますが、これは使えませんか?

    2008年5月27日 11:36
  • 現在時刻を100分の1秒まで収得する方法はわかりません。
    ただ、「タイムラグのような物が発生したりするのでしょうか?」については、システムタイマーの分解能の問題だと思います。

     

    現在時刻を100分の1秒まできっちり得たい、100分の1秒までカウントしないとダメであれば、DateTimeは使用できません。


     

    システムによって異なりますが、システムタイマーの分解能は、15.625ミリ秒前後になるはずです。
    以下のようなプログラムでシステムタイマーの分解能を得ることができます。

    C#でのサンプルソースです。

     

    Code Snippet

    private void button1_Click(object sender, EventArgs e)
    {
        DateTime dt = DateTime.Now;
        while (dt == DateTime.Now)
        {
            continue;
        }
        TimeSpan ts = DateTime.Now - dt;
        double d = Convert.ToDouble(ts.Ticks) / 10000d;

        MessageBox.Show(d + "ミリ秒", "システムタイマーの分解能");
    }

    検証のために適当に作ったものなので冗長な部分はご容赦ください。

     

     

    DateTime.Now プロパティを参照すると、.NET Frameworkの中でどうなっているか?
    CLIのシェアードソースを元にを調べて見ました。

    内部で、GetSystemTimeAsFileName関数を使用されているようです。

     

    プラットフォーム SDK
    GetSystemTimeAsFileTime
    http://msdn.microsoft.com/ja-jp/library/cc429820.aspx

     

    GetSystemTimeAsFileNameについて調べていただくとわかりますが、これはシステムタイマーの分解能に依存します。

    2008年5月29日 7:30
  • Label1.Text=DateTime.Now.ToString(”hh:mm:ss.”)&DateTime.Now.Millisecond と記述しています。

     

    カスタム DateTime 書式指定文字列 にはミリ秒も含めた日時の書式指定の記述について書かれています。

    2008年5月29日 8:43

すべての返信

  • コロカンさん こんにちは。

    DateTime.Millisecondというプロパティがありますが、これは使えませんか?

    2008年5月27日 11:36
  • handcraftさん、こんにちは

     

    ご指摘のdatetime millisecond で収得できました。

     

    すばやい、ご回答ありがとうございました。

     

    2008年5月27日 12:26
  • 前回の案件についての追加質問です。

     

    handcraftさんのご指摘により、無事現在時刻の100分の1秒台を取得できました。

    ありがとうございました。

     

    そこで、質問があるのですが、この値(時刻)は正確なのでしょうか?

     

    システムの時刻を取得しているのだと認識しておりますが、

    その取得の際に、タイムラグのような物が発生したりするのでしょうか?

     

    または自分の記述が間違っているのでしょうか?

     

    コードはTimerのTickメソッドに

    Label1.Text=DateTime.Now.ToString(”hh:mm:ss.”)&DateTime.Now.Millisecond と記述しています。

     

    ご教授のほどよろしくお願いいたします。

    2008年5月28日 15:04
  • 現在時刻を100分の1秒まで収得する方法はわかりません。
    ただ、「タイムラグのような物が発生したりするのでしょうか?」については、システムタイマーの分解能の問題だと思います。

     

    現在時刻を100分の1秒まできっちり得たい、100分の1秒までカウントしないとダメであれば、DateTimeは使用できません。


     

    システムによって異なりますが、システムタイマーの分解能は、15.625ミリ秒前後になるはずです。
    以下のようなプログラムでシステムタイマーの分解能を得ることができます。

    C#でのサンプルソースです。

     

    Code Snippet

    private void button1_Click(object sender, EventArgs e)
    {
        DateTime dt = DateTime.Now;
        while (dt == DateTime.Now)
        {
            continue;
        }
        TimeSpan ts = DateTime.Now - dt;
        double d = Convert.ToDouble(ts.Ticks) / 10000d;

        MessageBox.Show(d + "ミリ秒", "システムタイマーの分解能");
    }

    検証のために適当に作ったものなので冗長な部分はご容赦ください。

     

     

    DateTime.Now プロパティを参照すると、.NET Frameworkの中でどうなっているか?
    CLIのシェアードソースを元にを調べて見ました。

    内部で、GetSystemTimeAsFileName関数を使用されているようです。

     

    プラットフォーム SDK
    GetSystemTimeAsFileTime
    http://msdn.microsoft.com/ja-jp/library/cc429820.aspx

     

    GetSystemTimeAsFileNameについて調べていただくとわかりますが、これはシステムタイマーの分解能に依存します。

    2008年5月29日 7:30
  • Label1.Text=DateTime.Now.ToString(”hh:mm:ss.”)&DateTime.Now.Millisecond と記述しています。

     

    カスタム DateTime 書式指定文字列 にはミリ秒も含めた日時の書式指定の記述について書かれています。

    2008年5月29日 8:43
  • 皆様、ご回答ありがとうございます。

     

    西脇さん、分解能に依存するのですね・・・

    リンク先、参考になりました。

    また、検証用のコードも書いてくださり、ありがとうございました。

     

    Hongliangさん、”fff”で取得できるのですね。

    まさに、求めていたものズバリでした。

    ご指摘のページは見たつもりなのですが、理解力が足りなかったようです。

    ありがとうございました。

     

    この案件はこれにて、解決済みといたします。

     

    道を示していただいたので、自分自身の知識を高めたいと思います。

    皆様、お付き合いいただき、ありがとうございました。

    2008年5月30日 9:57