あるフリーソフトをネット上に公開しています。ダウンロード数はのべ10万回くらいのオーダーになっています。
最近あるユーザー(1人、OSはXP)から、「起動→終了したあと、また起動すると二重起動の警告が出て立ち上がらない」と指摘がありました。この指摘ははじめてです。
自分のOS(98SE, XP, Vista)では問題ありません。
このユーザーに協力して貰って調べた結果を、以下に述べますので、お気づきのことがありましたら、ご教授ください。よろしくお願いいたします。
VS2005, VC++, MFC, SDI, CFormView で作っています。
二重起動防止のため Mutex を使っています。
最初、これに問題があるのではないかと思って、別スレッドでご相談しましたが、これには問題はないようであり、このユーザーの場合「このアプリを終了してもタスクマネージャーのプロセスタブに残っている」ことが判明しました。
このアプリでは、フォームビューに139個のコントロールを配置しています。
コントロールは、リソースファイルに記述しています。
種類は、押しボタン、ラジオボタン、チェックボタン、エディット、コンボボックス、スピンおよびテキストです。
149個を3通りのメニュー(A,B,C)で切り替えています。
切り替えは、ShowWindow(SW_HIDE) および ShowWindow(SW_SHOW) で行っています。
メニューAのとき使うのは60個、Bのとき57個、Cのとき22個です。
このユーザーに5通りのプログラムをテストして貰った結果は、次の通りです。
①Aに使う60個のみをリソースファイルに記述
②Bに使う57個のみをリソースファイルに記述
③Cに使う22個のみをリソースファイルに記述
④A+Bの117個をリソースファイルに記述
⑤A+B+Cの139個をリソースファイルに記述
【テスト結果】
①②③の場合は、起動→終了でタスクマネージャーのプロセスタブから消える。
④⑤の場合は、起動→終了してもプロセスタブに残る。
すなわち、このユーザーの場合「リソースファイルに記述してあるコントロールの数が、ある程度以上多いと、終了してもプロセスタブから消えない」ということです。
1.どうしてこういうことが起きるのでしょうか?
2.対策として、リソースに最初から139個のコントロールを記述するのではなく、コード(Create / Delete)で各メニューに必要な数だけ記述する方法を試みましたが、面倒過ぎて途中でやめています。
何かよい方法はないでしょうか?
各メニューごとにウィンドウを作ってらっしゃるようですけど
片方のウィンドウが終了されてないとかはないのかな?
終了時に明示的にDestroyWindowで潰してIsWindow
とかで本当終了しているか確かめてみたらどうだろう。
確認
>切り替えは、ShowWindow(SW_HIDE) および ShowWindow(SW_SHOW) で行っています。
これは、すべて一つのフォームにあり、
A〜Cタイプに合わせて、コントロールを毎に表示・非表示を切り替えている
という解釈でいいでしょうか?
>このユーザーに5通りのプログラムをテストして貰った結果は、次の通りです。
このテストは、
新規作成したプロジェクトに対し
リソースを140近く追加しただけで、処理内容は記述してないものでしょうか?
それとも、すでに作成されていたプロジェクトから
リソースだけをいじり、処理内容は残してあるものでしょうか?
そださん
> 各メニューごとにウィンドウを作ってらっしゃるようですけど
違います。
フォームビュー、すなわちメインウィンドウに139個のコントロールを配置して、メニュー毎に必要なものを表示し、使わないものを非表示にしています。
rinさん
> これは、すべて一つのフォームにあり、A〜Cタイプに合わせて、コントロール毎に表示・非表示を切り替えているという解釈でいいでしょうか?
その通りです。
> このテストは、新規作成したプロジェクトに対しリソースを140近く追加しただけで、処理内容は記述してないものでしょうか?
その通りです。
スケルトン+リソースにコントロール配置だけで、コードは一切書いていません。
こちらのスレにも書いておくね
#他の掲載先も書いて置くようにしようね。
あるフリーソフトをネット上に公開しています。
ソフト名、掲載サイト名(Vector,窓の社等)を示したほうがいいと思います。
ダウンロード数は延べ10万回くらい
ここの利用者も使っているかも知れません。
ソフトのアルゴリズム等から原因を探るのも大事ですが、
実際の症状を探るのも大切ですね。
たとえば、
「ある一定の操作を行うと必ずプロセスが残る。」
というのを探して
(こんだけユーザーがいるんだから見つけてもらうのも手ですね。
フリーソフトだし、見つかった直ればまた進展もあるだろうし。
ユーザーも作者もお互いに助かる。
シェアソフト だとそうはいかないだろうけど。)
そこから原因を探す手もあります。
本題ですね
スレッドを使っていないですか?
スレッド終了を確認後にソフトを終了していますか?
ソフト上できちんと行っていても実際に処理されていない可能性が多々あります。
ブレークポイントなしでデバッグ実行・終了でスレッドのリ−クがないか
調べるのを手ですね。
ここに移動しました。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200806/08060037.txt
未解決ですが、こちらは打ち止めにします。
応答戴いた方々、ありがとうございました。
ツイート | ![]() |