VbScriptの罠①「HTAでのDoEvents」


先日から、がりがりと
HTA上で、VbScriptをいじってるけど、VBや、OfficeのVBAと同じ感覚で
やってると以外とはまること多い。

関数のformatやらstrconvrがなかったり
その手のこまごましたものも多々あるんだけど
一番困ったことは、なんといいても

DoEvntsがないことでしょう。

なんかしら、代わりのものがあるやろと
sleepっぽいのやら、waitっぽいのやら
さがしてみるもない!
(vbScriptだけの話しなら、sleepはあるけどHTA上では使えない)

結論的にHTA上のVBScriptでは、
Windowsに制御を戻す処理がないことが確定!

これは、困った。

今作ってるのは、HTAで大量のデータ処理をやってるんだけど
当然ごとく大量にループするわけで
その間、がっつり固まった感じになってしまう。
先日かいたように
データ処理が完了したら使わなくなる代物なので
そんなにちゃんとしたものでなくていいのだけど
一応、残時間把握したいし、進捗状況とかもろもろ
画面に表示したい。


さらに恐ろしいことに、
HTAは、固まる時間が長引くと
「この画面が重くなってるけどとめますか?はい、いいえ」
みたいな画面がでてきて
(よく、ブラウザーで重いページをみると出てくる奴)
処理をとめてしまうのです!

回避すべき方法をいろいろ探すと、
おおむねsetInterval()を使えと書いてある。

うーむ、setIntervalを使う方法は意味はわかるんだけど
すでに作ってしまったloopロジック、この方法に乗せかえるの、ちょっと面倒な感じ。
呼び出す関数に引数があると
さらにじゃーくさい感じ。


で、考えました。

幸い、私自身の環境は各種開発ソフトがそろっているので
VB.netで
DoEventsして、終了だけするexeを作成。

Sub DoEvents
  Dim objShell
  Set objShell = CreateObject("Wscript.Shell")
  objShell.Run "DoEvents.exe"
End Sub

こんな感じのを、ループにはさむと
ちゃんと描画された!

少々反則的で、
exeを毎ループ実行するというのは 当然余分にリソース食うのは明白なので
ちゃんとした解決ではないんだけど

 一応は、なんとかりそうな感じ。

最終的には、毎ループごとに、描画するほどでもないので
パラメータの回数ごとに、DoEventsを実行するように

Sub CallDoEvents(inParam)
  If lngCount Mod inParam  = 0 Then
    Call DoEvents()
  End If            
End sub

こんな感じにして、

 各PGやループの量や、処理速度に応じて
いい感じに調節して今回は逃げ切ります。

誰かええ方法知ってたら教えてください!