shellコマンドでバックでIEを開いてその内容を配列に
入れるプログラムを走らせていますがIEを開いて処理するのに10秒
かかりその間CPU使用率が100%になり画面がロックしてしまいます。
処理に30秒くらいかかっても構わないのでCPU使用率を30%位に
押さえる手段はないでしょうか
配列に入れるのはループさせてるのかな?
ならばループ内にSleepなりDoEventsなり入れるとよいかも。
ただ30%ぐらいに押さえるわけではなくて、画面のロックは
解消されると思います。
#環境書いてないから,とりあえずVB6での回答で、、、
処理がWindowsに帰らないからCPUを独占してしまうわけで
ということは、処理をWindowsに帰してやればいいわけだから
DoEvents
という便利なものを使うといいらしい
※どう使うかわからない場合はすぐに聞かずにまず調べてね
あーでも「IEが開くまで」ということであれば、それはIE側が初期化処理とかしてるからなるもので、仕方ないけどね
VBのバージョンは何かな?
VB.NETならマルチスレッドにすると言う手も有るが。
CPU使用率は変わらないと思うけど、中断は受け付けるかも。
VB6.0です。 とりあえず配列にdoeventを 入れると
かなり早くなりました。あとFORMに負担をかけないようにと
SHELLコマンドで別ジョブを立ち上げてますがプログラムを
2つに分けると色々と面倒ですし、よくよく考えると2つにする
必要はないのかなと思ったりして。ご教授よろしくお願いします。
書き忘れたんですがShellコマンドは10秒後ごとのタイマーを
使用しています。タイマーは起動に時間がかかったりするので
しょうか。FORMの一番上のタイトルバーが反転しFORMのカーソルが
4、5秒間一瞬消えます。
横から失礼します。
> とりあえず配列にdoeventを 入れるとかなり早くなりました。
??配列にdoevent??
あと、イベントによって呼び出されたプロシージャ(Timer1_Timer()など)
の内部に、イベントを発生させるようなもの(DoEventsとか)を不用意にいれると、
イベントが再帰的に呼び出されてスタックオーバフロー例外が発生することがあります。
※たとえば…
テキストボックス:Text1 を貼り付けた Form に
Private Sub Text1_Change()
Text1.Text = Text1.Text + "a"
End Sub
と書いて実行し、テキストボックスに何か書くと…
> あとFORMに負担をかけないようにと
> SHELLコマンドで別ジョブを立ち上げてますがプログラムを
> 2つに分けると色々と面倒ですし、よくよく考えると2つにする
> 必要はないのかなと思ったりして。
> ご教授よろしくお願いします。
状況は分かりませんが、現在のShellで呼び出すプログラムと、
自プログラム内部に処理を移行したプログラムを比較してみてはどうでしょう?
> 書き忘れたんですがShellコマンドは10秒後ごとのタイマーを
> 使用しています。
> タイマーは起動に時間がかかったりするのでしょうか。
数ミリ秒の差異はありますが、
イベント待ち状態だったりDoEventsを適切に呼び出している状態なら、
人が分かるようなズレはまず起こらないと思います。
> FORMの一番上のタイトルバーが反転しFORMのカーソルが
> 4、5秒間一瞬消えます。
もしかしてその現象はShellを呼んでプログラムを起動しているときに起こりませんか?
→遅いPCで動作させているなら、環境変えてテストするしかないですねぇ…
※ウチのWin95だと時々なりますし…
Shellのところにブレークポイントを設定してから、
ステップインしてみて4,5秒かかるようなら、
それが原因の可能性大ですね。
Doevents'基本的に自プログラム対象です。
Sleep 10'APIビューアで見つけてください
これで解決しませんか?
補足
shellをタイマーで呼び出すと
ガッさんがいうようにオーバーフローになる可能性があるので
shellの終了を待って、
http://www.bcap.co.jp/hanafusa/VBHLP/tap_PrgEnd.htm
ここにシェルの終了待ち処理がのっています。
Do while true
Dim a as long
a=shell(???)
shellend(a)
doevents
sleep 5
Loop
インデントしてなくて申し訳ないです。
こんなのはどうですか?
ツイート | ![]() |