CPU使用率100%を回避するには


やまと  2005-09-09 03:43:03  No: 92157

shellコマンドでバックでIEを開いてその内容を配列に
入れるプログラムを走らせていますがIEを開いて処理するのに10秒
かかりその間CPU使用率が100%になり画面がロックしてしまいます。

処理に30秒くらいかかっても構わないのでCPU使用率を30%位に
押さえる手段はないでしょうか


KG  2005-09-09 04:58:09  No: 92158

配列に入れるのはループさせてるのかな?

ならばループ内にSleepなりDoEventsなり入れるとよいかも。

ただ30%ぐらいに押さえるわけではなくて、画面のロックは
解消されると思います。

#環境書いてないから,とりあえずVB6での回答で、、、


通ってみた  2005-09-09 05:18:33  No: 92159

処理がWindowsに帰らないからCPUを独占してしまうわけで
ということは、処理をWindowsに帰してやればいいわけだから

DoEvents

という便利なものを使うといいらしい

※どう使うかわからない場合はすぐに聞かずにまず調べてね


通ってみた  2005-09-09 05:20:17  No: 92160

あーでも「IEが開くまで」ということであれば、それはIE側が初期化処理とかしてるからなるもので、仕方ないけどね


我龍院忠太  2005-09-09 05:30:44  No: 92161

VBのバージョンは何かな?
VB.NETならマルチスレッドにすると言う手も有るが。
CPU使用率は変わらないと思うけど、中断は受け付けるかも。


やまと  2005-09-09 09:26:11  No: 92162

VB6.0です。  とりあえず配列にdoeventを 入れると
かなり早くなりました。あとFORMに負担をかけないようにと
SHELLコマンドで別ジョブを立ち上げてますがプログラムを
2つに分けると色々と面倒ですし、よくよく考えると2つにする
必要はないのかなと思ったりして。ご教授よろしくお願いします。


やまと  2005-09-09 09:40:07  No: 92163

書き忘れたんですがShellコマンドは10秒後ごとのタイマーを
使用しています。タイマーは起動に時間がかかったりするので
しょうか。FORMの一番上のタイトルバーが反転しFORMのカーソルが
4、5秒間一瞬消えます。


ガッ  2005-09-09 10:21:10  No: 92164

横から失礼します。
> とりあえず配列に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だと時々なりますし…


KG  2005-09-09 21:53:21  No: 92165

Shellのところにブレークポイントを設定してから、
ステップインしてみて4,5秒かかるようなら、
それが原因の可能性大ですね。


ヤマ  2005-11-09 06:31:05  No: 92166

Doevents'基本的に自プログラム対象です。
Sleep 10'APIビューアで見つけてください

これで解決しませんか?


ヤマ  2005-11-09 14:29:09  No: 92167

補足
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

インデントしてなくて申し訳ないです。
こんなのはどうですか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加