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 関数 安全な待機関数 安全な待ち時間処理 |