Visual C++ 6.0のMFCを使っています。
処理時間の掛かる長い計算をやらせて、長いときには数日間処理を続けています。
プログラムの流れとしては、
ダイアログ上でボタンをクリック
↓
多重のfor文処理
です。
進行状況はプログレスバーで表示させていて、1日くらい処理させていても実際に思い通りに動作をして問題がないのですが、ダイアログが常に手前にないと(アクティブでないと)フリーズしてしまいます。
よくあるのが、ウイルスバスターなどの自動アップデートダイアログが起動して、ダイアログが非アクティブになってしまい、その後アクティブにしてもフリーズしていてプログレスバーが進みません。
プログラムの処理中に、処理結果をファイルセーブし、すでに処理済のファイルは随時他のパソコン確認するので(ウィンドウズ共有フォルダで)、ネットワークなどの接続を切れず、ウイルスバスターを切ることもパソコンの環境上できません。
何か方法がありますでしょうか?
よろしくお願いします。
> 何か方法がありますでしょうか?
ここで述べられているのは現状の説明であり、質問でも相談でもありません。
何の方法がお知りになりたいのですか?
フリーズというのは,どのような状況を意味して言っているのですか?
単に再描画がされないだけではないですか?
再描画されないと言うだけであれば,単にメッセージを処理するタイミングがないだけです。
マルチスレッド化(推奨)や,PeekMessageとPumpMessageによる簡易メッセージループとか,メッセージを処理するタイミングを用意してやればよいです。
επιστημηさん、説明不足で申し訳ありません。
ダイアログが非アクティブになった際でも、無事に処理を続行してもらえるようにしたいのですが、何か方法がありますでしょうか?
という意味です。よろしくお願いします。
YuOさん、ありがとうございます。
フリーズは、プログレスバーの再描画がされないのもありますし、プログラム自体が「応答なし」になることもあります(これは毎回ではありません)。
「応答なし」になっていない状態の場合は、処理が継続されているのか分かりません。
PeekMessageとPumpMessageに関して一度調べてみます。
マルチスレッドは以前ちょっと勉強したのですが、挫折してしまって、もう一度勉強してみます。
while(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)){
if(!GetMessage(&msg,NULL,0,0)) return;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
で行うことができました。ありがとうございました。
補足
「応答なし」は5秒以上メッセージを処理していないというだけで、フリーズと同意ではありません
メッセージループを挟み込むと簡単に解決できますけれど、
本来、そこにメッセージループが無ければ流れなかったような
タイミングでメッセージが流れるので安易に使うとハマリます。
注意が必要ですよ。
ツイート | ![]() |