Ext JS に関しては,新しい記事は Sunvisor Lab. ExtJS 別館 にあります。そちらもよろしくお願いいたします。
DoEventsをうまく使う
投稿者:sunvisor 投稿日時:2010/02/24(水) 16:41
AccessのVBAで時間のかかる処理をすると,画面が更新されなかったり,Windowsから(応答なし)扱いされたりします。それをさけるためには,DoEventsを呼び出すのですが,なにも考えずに呼び出すとパフォーマンスが大幅に低下します。これをなんとかしようという試みです。
まずは「DoEventsをパフォーマンスを下げずに使う方法」というページに紹介されていた手法を使ってみます。
Private Declare Function GetInputState Lib "USER32" () As Long
Public Sub CheckEvents()
If GetInputState() Then
DoEvents
End If
End Sub
これは,GetInputState APIをコールして,待機中のイベントがあればDoEventsをコールするというものです。このCheckEventsプロシージャをDoEventsの代わりにコールすれば,パフォーマンスは低下せず,画面も更新されます。
しかし,これでもしばらく(10秒ぐらい)Accessのウィンドウを放置しておくと,(応答なし)扱いになり,その後は画面更新もうまくされないようになってしまいます。そこで,一定時間がたったときには待機中のイベントがなくてもDoEventsをコールしてみます。
Private Declare Function GetInputState Lib "USER32" () As Long
Private m_Time As Variant
Public Sub CheckEvents()
If GetInputState() Or (DateDiff("s", m_Time, Time) > 1) Then
DoEvents
m_Time = Time
End If
End Sub
これは,待機中のイベントがあるか,前回の呼び出しより1秒以上経過しているか,いずれかであればDoEventsを呼び出します。モジュールレベル変数のm_Timeに前回呼び出し時の時間がセットされます。このプロシージャをDoEventsの代わりに呼び出せば,パフォーマンスと操作性の両立ができるのではないかと思います。
トラックバック
人気のあるページ
- Robocopyでフォルダをコピー
- Robocopy よく使うオプション
- Active Directoryのユーザ管理 (1)
- SQL Server で文字列の半角/全角変換
- SQL Server 2005からリンクテーブルでOracleに接続する
- Windowsサーバでのレプリケート失敗を解決
- LDAP認証とActive Directory
- SQL Server 2005のデータベースコピーウィザードを使う
- WebClientサービスをポリシーで止める
- ログオン時にドライブやプリンタを割り当てる
- ログオン,ログオフ状況を記録するスクリプト
- 設定系スクリプト実行時にUACに邪魔されるのを回避する
