VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

リンク元へ戻ります。 関数・メソッド関係のメニュー
1.変数関係
2.VB6.0 からの文字列関数の使用例
3.インプットボックス関数をマスターする
4.指定時間待つ、待機関数
5.ちょっと便利な自作関数集
6.API関数の使い方(簡単な)
7.Visual Basic 6.0 用簡易リファレンス
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.


4.指定時間待つ、待機関数
1.指定時間待つ(一般的な方法)
2.SetWaitableTimer API を使用した待機関数(MSのサポート技術情報に掲載分)
3.MsgWaitForMultipleObjects を使った待機関数の紹介
4.
5.
6.
7.
8.
9.
 下記プログラムコードに関する補足・注意事項 
動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6)
Option :[Option Explicit]
参照設定:追加なし
使用 API:
なし
その他 :
    :
このページのトップへ移動します。 1.指定時間待つ(一般的な方法)
プログラムの実行を一時停止するために Sleep API 関数を使ったり、下記のようにDoEvents と Sleep とを併用して使ったりしていたのですが、最近になって Sleep 関数は、VB では使用しない方がいいと言う書き込みが多く見受けられるので、今後は、こういった方法は、テスト環境だけにとどめておき、実装しないようにして下さい。
ここのサンプルでも、便宜上使っていたりしますが、実装される場合は、次に紹介する関数の方を使用するようにして下さい。

従来の方法(使用しないで下さい)
-----------------------------------------------------------------------------------
Private Sub WaitTime(st As Long)
'指定の時間待つ(1/1000 秒単位で指定)
  Dim lngSt As Long
  lngSt = timeGetTime
  Do While timeGetTime - lngSt < st
    DoEvents
    Sleep 50
  Loop
End Sub

一応、待機中 DoEvents を入れているので、他の処理を受け付けます。
DoEvents だけだと CPU の使用率が、UP しますので、Sleep 50 で、CPU の使用率を軽減していますが、DoEvents や Sleep を繰り返し頻繁に使用する以上、予期せぬ問題をおこす可能性があります。

このページのトップへ移動します。 2.SetWaitableTimer API を使用した待機関数(MSのサポート技術情報に掲載分)
Visual Basic で SetWaitableTimer を使用する方法
http://support.microsoft.com/kb/231298/ja

上記にサンプルが掲載されているので、それを使って DLL 化して参照設定して使用するようにして下さい。
注意点としては、
dblUnits = CDbl(&H10000) * CDbl(&H10000)
dblDelay = CDbl(lNumberOfSeconds) * 1000 * 10000
の部分を下記のように変更するとミリ秒に変更できます。
dblUnits = CDbl(&H10000) * CDbl(&H10000)
'単位を秒からミリ秒に変更
dblDelay = CDbl(lNumberOfSeconds) * 10 * 1000

1.[新しいプロジェクト]で ActiveX DLL を選択する。
2.プロパティウィンドウで、クラスモジュールのInstancingプロパティを6−GlobalMultiUse に変更して下さい。

3.クラスモジュールに標準モジュールに書いてあるコードを貼り付けて下さい。
   上記コードは、MS のサイトの Visual Basic で SetWaitableTimer を使用する方法 を使用
   http://support.microsoft.com/kb/231298/ja

4.プロジェクトのプロパティを設定する。
  メニューの[プロジェクト]→[Project1のプロパティ]メニューを選択し、プロジェクト名を設定して下さい。
  (ここでは MyWaitDll と付けます)
5.コンパイルする
  メニューの[ファイル]→[MyWaitDllの作成]で通常のEXEファイルを作成するのと同じ要領です。

----------------------------------------------------------------------------------------------------
MyWaitDll の使用方法

上記で、DLL(MyWaitDll)を作成するのが難しい方は、下記からダウンロードして使って下さい。
 MyWaitDll.zip(2015/12/15 4KB)

上記ファイルをダウンロードして使用する場合は、[レジストリに登録]しておいて下さい。

尚、ご自分で作成された場合は、コンパイル時に登録されますので、別途、登録する必要はありません。
登録されていれば、参照可能ライブラリ ファイルに表示されているはずです。

作成したDLL(MyWaitDll)の使用方法
メニューの[プロジェクト]→[参照設定]で参照可能なライブラリの中から作成した[MyWaitDll]を探し(MyWaitDll を保存してあるフォルダー)チェックボックスにオンを入れます。
後は通常の標準モジュールに書いたプロシージャを呼出すのと同じ方法でできます。

Option Explicit

Private Sub Command1_Click()
  Command1.Enabled = False
  Wait 5000   '5秒間待つ (MSのサンプルとは別にミリ秒で設定)
  Command1.Enabled = True
End Sub

上記実行中は、他の処理も受け付け、実行中は、CPU の使用率が異常に上がる事もありません。

このページのトップへ移動します。 3.MsgWaitForMultipleObjects を使った待機関数の紹介

MsgWaitForMultipleObjects を使った方法は、下記に投稿されておられるので、紹介しておきます。

K.J.K. さん [E-Mail] 2005/10/22(土) 16:38:28
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200510/200510_05100129.html


魔界の仮面弁士 さん 2007/06/11(月) 11:29:00
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200706/200706_07060026.html

このページのトップへ移動します。 4.


このページのトップへ移動します。 5.


このページのトップへ移動します。 6.


このページのトップへ移動します。 7.


このページのトップへ移動します。 8.


このページのトップへ移動します。 9.


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
Windowを持ったスレッドでメッセージ処理を止めるべきではない 上記、 K.J.K さんの投稿文より引用
Sleep している間は、ウィンドウメッセージを処理できなくなりますので、ウィンドウを持つアプリは、そのメインスレッドから Sleep API を呼ぶべきでは無いとされています。 上記、魔界の仮面弁士さんの投稿文より引用
待ち時間処理 指定の時間処理を待つ 処理を一時止める 待機する Wait 処理 プログラムを一時停止 プログラムの実行を一時停止
Sleep 関数 API 関数 安全な待機関数 安全な待ち時間処理


このページのトップへ移動します。