人に聞けない痔の悩み、これでスッキリ >>

VB初心者です。
さっそくですが、VBで、msecのデータを扱うのに”GetTickCount”を使っていますが、精度はともかくまれにありえない大きな数値が帰ってきます。プログラムと実行結果は下記の通りですが、何が原因でしょうか?
OSは、WindowsXPです。
アドバイスよろしくお願いします。


<プログラム>
Dim BeforeTime As Long
Dim NowTime As Long
Dim n As Integer
'システムを立ち上げてからの経過時間(単位:ミリ秒)を取得
Private Declare Function GetTickCount Lib "Kernel32" () As Long
'実行処理
Private Sub buttonRun_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles buttonRun.Click
For n = 1 To 20
TimeCheck()
Next
End Sub
'データ取得&表示
Private Sub TimeCheck()
BeforeTime = GetTickCount
TextBox1.Text = TextBox1.Text & n & " : " & BeforeTime & " " & BeforeTime - NowTime & ControlChars.CrLf
NowTime = BeforeTime
End Sub


<実行結果>
No 現在の取得値  → 前回との差
------------------------------------
0 : 225661890149886 → 初回取得値
1 : 225661890149886 → 0
2 : 225661890149886 → 0
3 : 225661890149886 → 0
4 : 225661890149886 → 0
5 : 225661890149886 → 0
6 : 225661890149886 → 0
7 : 225661890149886 → 0
8 : 225661890149886 → 0
9 : 225661890149886 → 0
10 : 225661890149886 → 0
11 : 225666185117197 → 4294967311
12 : 225666185117197 → 0
13 : 225666185117197 → 0
14 : 225666185117197 → 0
15 : 225666185117197 → 0
16 : 225666185117197 → 0
17 : 225666185117197 → 0
18 : 225666185117197 → 0
19 : 225666185117197 → 0
20 : 225666185117213 → 16

以上

このQ&Aに関連する最新のQ&A

とは API」に関するQ&A: JAVADOC、API とは

A 回答 (2件)

VBのバージョンと関数定義が間違っています。


> Handles buttonRun.Click
このコードは VB.NET 以降のもの。

VB.NET 以前(VB6.0など)と大きく仕様変更がありました。
処理のベースが 16bit→32bit に変わりました。
http://msdn.microsoft.com/ja-jp/library/dd297710 …

> Private Declare Function GetTickCount Lib "Kernel32" () As Long
この定義は VB.NET 以前のものですので、Long を Integer に
変更する必要があります。

ただ、GetTickCount って System.Environment.TickCount
がフレームワーク上から呼び出していたような気もします。
http://dobon.net/vb/dotnet/system/tickcount.html
自分で初心者と言っているような人が API 宣言使うより、
フレームワークの関数を利用した方がいいと思います。
    • good
    • 0
この回答へのお礼

丁寧な回答大変ありがとうございました。
Long を Integer にしたら解決しました。
助かりました。

お礼日時:2011/06/30 19:20

VBを使っていないので、見当はずれの横槍になるかもしれませんが。



まずこれをわかりやすく書いてください。
他人が見た時は無意味なデータで混乱します。
TextBox1.Text = TextBox1.Text & n & " : " & BeforeTime & " " & BeforeTime - NowTime & ControlChars.CrLf

TextBox1.Text = TextBox1.Text & n & " : " & BeforeTime - NowTime & ControlChars.CrLf

・VBの数値の型とAPIの型は合っているでしょうか。違っているような気がします。
そのためにこんなありえない値が出るのではないかと。4,294,967,311
昔のlongと今のVBのlongではビット数が2倍違うのでは?

・私の古いXP機、Excel VBAでもわずか1msで8000回も取得できます。
プログラムがCPUを占有していると数百msくらいになることはあるかもしれません。
0以外の値を簡単に取得したければループの中にDoeventsを入れてください。

VBAの場合で、また私のHPなのですが参考にしてください。
http://homepage2.nifty.com/DreamyCat/APIpage1.htm
    • good
    • 0
この回答へのお礼

丁寧な回答大変ありがとうございました。
型でした、型を合わせたら解決しました。
助かりました。

お礼日時:2011/06/30 19:21

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB.NETでラベルの大きさってどうやって変えるの?

VB.NETでラベルの大きさってどうやって変えるの?
バージョンは2008

Aベストアンサー

あれ?
普通に
Widthプロパティ
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.width%28VS.100%29.aspx
やHeightプロパティを変更すればできるはずだけど、コード、IDE問わず。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.height%28VS.100%29.aspx

#まぁAutoSizeプロパティをfalseにしないと、Textプロパティに代入された文字列を格納するのに必要な最低限の大きさに自動で調整されちゃうみたいだけど。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.autosize.aspx

Qミリ秒を○時間○分○秒にしたい

http://www.excellenceweb.net/vba/api/what_windows_api.html
のページを参考にPC起動時間を取得したいのですが
サンプルは単位がミリ秒になっています。

--------------------------------------------------
Declare Function GetTickCount Lib "kernel32.dll" () As Long

Sub TEST1()
Dim Tickcount As Long
'GetTickCount関数から、起動からの時間が返される
Tickcount = GetTickCount()
MsgBox "PC起動から " & Tickcount & " ミリ秒経過しています"
End Sub
--------------------------------------------------
○時間○分○秒にしたいのですが
どうすればいいでしょうか?

Formatを使うと思うのですが
どういうコードを書けばいいのかわかりません。

ご教授よろしくお願いします。

http://www.excellenceweb.net/vba/api/what_windows_api.html
のページを参考にPC起動時間を取得したいのですが
サンプルは単位がミリ秒になっています。

--------------------------------------------------
Declare Function GetTickCount Lib "kernel32.dll" () As Long

Sub TEST1()
Dim Tickcount As Long
'GetTickCount関数から、起動からの時間が返される
Tickcount = GetTickCount()
MsgBox "PC起動から " & Tickcount & " ミリ秒経過しています"
End Sub
---------------------...続きを読む

Aベストアンサー

MsgBox CStr(CInt(DateAdd("s", Tickcount, 0))) & "日と" _
& Format(TimeValue(DateAdd("s", Tickcount, 0)), "hh時間nn分ss秒")
に差し替えてください。

QForm間の値の渡し方

1つのForm上のコマンドボタンで別のFormを表示、そこで変数に値を入れ、そのFormを閉じ、元のFormでその変数を使いたいのですが、どうもうまくいきません。
実施したやり方は、一方のFormの宣言領域で、”Public abc As String”を宣言、両方のFormの(変数に値を入れた方と変数を使う方の)プロシージャーの宣言では引数として(abc As String)と記述しました。
因みに、両プロシージャーともイベントプロシージャーです。何か基本的なことができていないのだとは思いますが、どなたか教えていただけませんか?よろしくお願いします。

Aベストアンサー

すでに何件か回答があがっていますので、少し変わった方法をご参考までに。

あまり使われませんが、Formにはtagというプロパティがあります。
これは「文字列形式であれば何でも格納できる」という、上手く使えば便利なプロパティです。

FormAからFormBを呼び出し、FormBで変更した値をFormA.tagにセットします。
ここでFormBをUnloadしてもFormA.tagの値は影響を受けないので自由に使えます。

複数の値を呼び出し元に戻してやる場合に、区切り文字(カンマなど)で連結した文字列をtagに格納し、呼び出し元で区切り文字でsplitして、複数の値を受け渡すという手法をよく使っています。

QVB6 配列を初期化したい

VB6でループさせて配列に値を入れて、計算させて最終的に求めたい値をRとします。そのときループで繰り返すためか同じ配列に値を入れてどんどん値がでかくなりRの値がおかしくなってしまいます;
おそらく問題は一回前に入れた配列がそのままのこってしまってるからなのだと思うのですが;
配列の中の値をクリアする方法はないものでしょうか?
一応、配列=0として初期化しようとしても値は変わらず前のが残ったままになってしまっています;
どなたかわかる方いらっしゃいましたらご回答宜しくお願いします

その他何かいい方法があればそれも教えていただけたらと思います

Aベストアンサー

Eraceステートメントを使用

  Dim a() as Long
  Dim s(100) as String
  Dim x() as Long

  Erase a     ’要素が0になる
  Erase s     ’要素が""になる

  Redim x(100) as Long

  Erase x      ’メモリを解放

注)VB2005の場合は動作が異なるので注意して下さい。

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む


人気Q&Aランキング