#114 DoEventsをパフォーマンスを下げずに使う方法 VBA、API

DoEvents関数は、プログラムで占有していた制御をOSに一時的に渡すための関数です。時間のかかるループ処理をコマンドボタンのクリックなどで中止させるような場合、クリック時イベントをWindowsに検出させるためにはこのDoEvents関数が必要となります(その具体的な使用例については「#92 時間のかかる処理を途中で中止できるようにする方法」を参照してください)。

DoEvents関数を用いると、Windowsのイベントキューの内容を調べるためのオーバーヘッドによって極端にパフォーマンスが低下します。ループ処理を途中でキャンセルできる機能よりもその処理時間を優先させたい場合には、DoEvents関数は使わない方が無難です。

しかし、WindowsAPIの「GetInputState」関数を使うと、DoEvents関数を使わないのと同じ程度までパフォーマンスを改善することができます。DoEvents関数は完全にOSに制御を渡してしまいますが、GetInputState関数はイベントキューに待機中のイベントがあるかないかだけを調べます。これを利用すれば、イベントが発生しているときだけOSに制御を渡すことによって余分なイベント確認処理をしないで済むわけです。

GetInputState関数はAPI関数ですので、プログラム中でこれを使うためには、標準モジュールの"Declarations"セクションに次の宣言を追加します。先頭に"Private"を付ければ、特定のフォームモジュール内でも宣言可能です。
Declare Function GetInputState Lib "USER32" () As Long

そして、ループ処理の部分を次のようにします。
Dim iintLoop As Integer

For iintLoop = 1 To 30000

  'ここで時間のかかる処理を実行

  If GetInputState() Then DoEvents
Next iintLoop
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved