実行中のプログラムをキャンセルする方法


モヴェ  2007-12-25 16:49:25  No: 138477  IP: 192.*.*.*

はじめまして、早速ですが質問の方をさせていただきます。

VB6.0でプログラムを作成しているのですが、ある処理を実行中に「処理中です」と書かれたフォームを出力し、そのフォームにキャンセルボタンをつけているのですが、裏で実行されているプログラムの処理が重いのかキャンセルを押してもキャンセル処理が実行されない状態になってしまいます。

自力で調べてDoEventsというものがあるのはわかったのですが、これを使用しても思ったようにキャンセルが実行できません。

何か他に方法がありましたらどなたか教えてください。
よろしくお願いします。

編集 削除
ガッ  2007-12-25 20:14:45  No: 138478  IP: 192.*.*.*

基本的にvb6でマルチスレッドは難しいので,単一プロセス上で自力で並列処理を行わせていると推測します.

で,

> 裏で実行されているプログラムの処理が重いのか
ここが重要で,DoEventsの使用頻度とか色々あるので,
とにかく何が何所でどの位実行されているなど,
どういう原因で反応が遅れているのかを突き止めてみてください.

編集 削除
魔界の仮面弁士  2007-12-25 20:30:17  No: 138479  IP: 192.*.*.*

> ある処理を実行中
それは、どのような処理なのでしょうか?
たとえば、データベース操作などで時間がかかっている場合には、
ADO の非同期モードを使うことで、DoEvents 無しでもキャンセル対応が可能です。

> これを使用しても思ったようにキャンセルが実行できません。
どういうコードを書いているのか分からないと、アドバイスできません。

DoEvents を繰り返すようなループ処理中で判定するような場合には、
「DoEvents が、どの程度の頻度で呼ばれているのか」と、
「キャンセルの状態は、どの程度の頻度で判定されているのか」が
問題になってきます。

とりあえず、こちらでテスト的に書いてみたサンプル。
http://www.vb-user.net/junk/replySamples/2007.12.25.18.01/200712251801.txt


なお、VB6 では、マルチスレッドなアプリを生成できない(作りにくい)ため、
処理自体に時間がかかってしまい、そもそも DoEvents を呼び出す暇さえ
無いような状況では、いっそ、exe 自体を分割し、別アプリとして呼び出すのも
一つの手かと思います。

編集 削除
モヴェ  2007-12-26 10:37:25  No: 138480  IP: 192.*.*.*

回答ありがとうございますm(__)m

>>ガッさん
処理が重い原因はキャンセルしたい処理が実はある関数なのですが、
その関数が何をやっているかというと300行近くにわたって複雑?な計算を行っています。
そしてその結果をExcelに書き出すというものなのですが、実行するとこの300行近くある計算式のところで既にCPUの使用率が100%超えます・・・。

>>魔界の仮面弁士さん
サンプルコードまでありがとうございますm(__)m
実際にTimerも使って見ましたが上に書いたとおり300行近くある計算式のせいなのか、Timerイベントすら起きませんでした・・・orz
しかたないので計算式の途中に所々DoEventsをはさんだところ多少改善されました。

VBの処理速度って計算を300行程度あるとすぐCPU100%状態になってしまうんですかね?
気になったのはやけにコメントが多くてコメント行も300行近くあるのですが、それが処理速度に関係したりするのでしょうか?

編集 削除
CPU  2007-12-26 11:45:40  No: 138481  IP: 192.*.*.*

行数とCPU 100%は関係ないでしょう。
I/Oなどの待ちがなければ、CPU 100%になるだけ。

ところで、お二人のレスの後にマルチポストしたのは、なぜでしょうか?

編集 削除