長時間の処理でのフリーズに関して

解決


ふみ  2006-06-20 14:01:02  No: 62246  IP: 192.*.*.*

Visual C++ 6.0のMFCを使っています。
処理時間の掛かる長い計算をやらせて、長いときには数日間処理を続けています。
プログラムの流れとしては、
  ダイアログ上でボタンをクリック
    ↓
  多重のfor文処理
です。

進行状況はプログレスバーで表示させていて、1日くらい処理させていても実際に思い通りに動作をして問題がないのですが、ダイアログが常に手前にないと(アクティブでないと)フリーズしてしまいます。
よくあるのが、ウイルスバスターなどの自動アップデートダイアログが起動して、ダイアログが非アクティブになってしまい、その後アクティブにしてもフリーズしていてプログレスバーが進みません。
プログラムの処理中に、処理結果をファイルセーブし、すでに処理済のファイルは随時他のパソコン確認するので(ウィンドウズ共有フォルダで)、ネットワークなどの接続を切れず、ウイルスバスターを切ることもパソコンの環境上できません。

何か方法がありますでしょうか?
よろしくお願いします。

編集 削除
επιστημη  2006-06-20 14:08:10  No: 62247  IP: 192.*.*.*

> 何か方法がありますでしょうか?

ここで述べられているのは現状の説明であり、質問でも相談でもありません。
何の方法がお知りになりたいのですか?

編集 削除
YuO  2006-06-20 14:10:41  No: 62248  IP: 192.*.*.*

フリーズというのは,どのような状況を意味して言っているのですか?
単に再描画がされないだけではないですか?

再描画されないと言うだけであれば,単にメッセージを処理するタイミングがないだけです。
マルチスレッド化(推奨)や,PeekMessageとPumpMessageによる簡易メッセージループとか,メッセージを処理するタイミングを用意してやればよいです。

編集 削除
ふみ  2006-06-20 14:26:42  No: 62249  IP: 192.*.*.*

επιστημηさん、説明不足で申し訳ありません。
ダイアログが非アクティブになった際でも、無事に処理を続行してもらえるようにしたいのですが、何か方法がありますでしょうか?
という意味です。よろしくお願いします。

YuOさん、ありがとうございます。
フリーズは、プログレスバーの再描画がされないのもありますし、プログラム自体が「応答なし」になることもあります(これは毎回ではありません)。
「応答なし」になっていない状態の場合は、処理が継続されているのか分かりません。
PeekMessageとPumpMessageに関して一度調べてみます。
マルチスレッドは以前ちょっと勉強したのですが、挫折してしまって、もう一度勉強してみます。

編集 削除
ふみ  2006-06-20 15:01:40  No: 62250  IP: 192.*.*.*

while(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)){
    if(!GetMessage(&msg,NULL,0,0)) return;
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
で行うことができました。ありがとうございました。

編集 削除
通りすがり  2006-06-20 15:18:46  No: 62251  IP: 192.*.*.*

補足
「応答なし」は5秒以上メッセージを処理していないというだけで、フリーズと同意ではありません

編集 削除
PATIO  2006-06-21 14:28:58  No: 62252  IP: 192.*.*.*

メッセージループを挟み込むと簡単に解決できますけれど、
本来、そこにメッセージループが無ければ流れなかったような
タイミングでメッセージが流れるので安易に使うとハマリます。
注意が必要ですよ。

編集 削除