いつもお世話になっています。
現在、リソース不足発生の解決策を探しております。
例えば・・・
↓
XPVC++6.0にて
↓
新規プロジェクトでMFCアプリケーションの
スケルトンプロジェクト作成
↓
実行
↓
メモリチェックソフト等でリソースを随時チェック
↓
子ウィンドウを開く
↓
リージョンの値が増加(メモリチェックソフトにて)
↓
子ウィンドウを閉じる
↓
リージョンの値はそのまま
↓
このまま、400回程繰り返すと
リージョン、GDIリソース、Userリソースが大幅に増加。
リソース不足でアプリケーションが死んでしまいます・・・。
このようなテストをmicro softのエクセル等でチェックしてみたところ
子ウィンドウクローズ時にリージョンが減少し、リソース不足対応はされているようで
す。
対応策としてはOS側として
マイコンピュータ→プロパティ→詳細設定→パフォーマンス→パフォーマンスを優先す
る
をチェックすると対応できることも分かりましたが。。。
(子ウィンドウオープン時、リージョンの増加がしない)
VC++内での対応策はないものでしょうか?
ご助言よろしくお願いします。
すみません、リージョンの増加によるリソース不足ではなく。
GDIリソースが9999付近まで増加した時のシステム不足でした。
でも、原因まではいまだ掴めておりません。
よろしくお願いします。
度々すみません、訂正です。
リージョン追加を確認しました。
MFCアプリケーション(スケルトン)で
子ウィンドウ新規作成→クローズ
を1653回繰り返すとリソース不足によるエラー発生です。
何かご助言よろしくお願いしますm(__)m
意味がちゃんと伝わってないから、誰もレス付けないんじゃないの?
俺の環境も
XP PRO
Visual Studio 6(EP)(SP6)
だけど
>新規プロジェクトでMFCアプリケーションの
>スケルトンプロジェクト作成
こんな項目無いし
MFC APPWIZARD(EXE,DLL) だったとしても
実際 IDE で
>子ウィンドウを開く
>↓
>リージョンの値が増加(メモリチェックソフトにて)
>↓
>子ウィンドウを閉じる
の単純繰り返しを1653回もやる現実的作業じゃないし
もう少し、理解可能なように書いてくれませんか?
↑書き込んでから思ったんですけど
実はIDEがメモリリークして困っているのでは無く
MFC MDI グラフィック描画アプリがメモリリークして困っている
って事でしょうか?
ならば、ソースコード 載せるとかしないと レス 付かないかも
>(子ウィンドウオープン時、リージョンの増加がしない)
これどうやって見つけたのかも説明欲しいかも
お返事ありがとうございます。
>>MFC MDI グラフィック描画アプリがメモリリークして困っている
>>って事でしょうか?
すみません・・・。
VC++で作成したプロジェクトは
MFC AppWizard(exe)
です。
プロジェクト内でソース作成せず空のスケルトン内でテストしました。
おそらくGDIリソースがメモリリークしています。
テスト時のリージョン、GDIリソースの参照には
MemSpy2.0を使用。
>>単純繰り返しを1653回もやる現実的作業じゃないし
現実的な作業ではありませんが、プログラマーが直せる範囲のエラーでしたら、
直したいと思い、助言いただければと思いました。
原因はわかりませんが、確かに発生しますね。(XP Pro SP2、VC++6.0)
MFC AppWizard (exe)で、MDIアプリケーションを作成し、
生成されたスケルトンをビルドして実行します。
タスクマネージャの[プロセス]ページで確認してみると、
確かにMDI子ウィンドウをオープンするごとに
GDIオブジェクトの数が6つ程度増加し、しかも
子ウィンドウを閉じても減りません。
なお、XPのテーマをWindows クラシックにすると発生
しなくなりました。
また、SDKで単純なMDIアプリケーションを作成し、
実行した場合も再現しませんでした。
MFC内部で行われている何らかの処理(ウィンドウ背景ブラシ等)
が関係しているような気がします。
Kerryさん、お返事ありがとうございます。
自分もGDIオブジェクトの数が6つ程度増加します。
>>MFC内部で行われている何らかの処理(ウィンドウ背景ブラシ等)
>>が関係しているような気がします。
そうなんですか・・・。
同じ動作をExcel等で行ってみたところ子ウィンドウクローズ時に
GDIオブジェクトの数が減るんですよ・・・。
# 回答ではなくてすみません。
> このようなテストをmicro softのエクセル等でチェックしてみたところ
> 子ウィンドウクローズ時にリージョンが減少し、リソース不足対応はされているようです。
> 同じ動作をExcel等で行ってみたところ子ウィンドウクローズ時に
> GDIオブジェクトの数が減るんですよ・・・。
Excel のバージョンが分りませんが、Excel ってもともと MFC ベースじゃないですよね。
(それとも最近のものはMFC6.0ベースで書き換えられているんでしょうか.....)
単に比較対象としての非MFCアプリの例ということでしょうか。
MFC6.0製のアプリで対策されているのであれば参考になるかと思うのですが、
非MFCで、SDKや別フレームワークを使ったものや、
MFC6.0以外の、例えばMFC7.0を使ったものと
直接動作を比較してもあまり意味がないような気が....。
(WinXPのバグではないことがわかるだけ?)
> なお、XPのテーマをWindows クラシックにすると発生
> しなくなりました。
MFC6.0 の開発当時(発売が97年?)に想定もされていなかった特殊な環境下(XPのテーマ)で、
MFC6.0 がそれ以前の環境(非XP)用に用意したMDI用のスケルトンをそのまま使うと問題がでる。
(だから、MFC6.0のスケルトンをXPでも正しく動作するように修正する方法を探されている)
ということでしょうか。
# 今ちょっと環境をいじれないので確認できませんが、MFC7.0だと問題ないとかありそうな....
Banさん、お返事ありがとうございます。
とても勉強になりました。
>>Excel のバージョンが分りませんが、Excel ってもともと MFC ベースじゃないです
>>よね。
>>(それとも最近のものはMFC6.0ベースで書き換えられているんでしょうか.....)
>>単に比較対象としての非MFCアプリの例ということでしょうか。
そうだったんですか、それですと確認方法が甘かったと思います。
>>MFC6.0 の開発当時(発売が97年?)に想定もされていなかった特殊な環境下(XPのテ
>>ーマ)で、
>>MFC6.0 がそれ以前の環境(非XP)用に用意したMDI用のスケルトンをそのまま使うと
>>問題がでる。
そう考えますと少し我侭な質問だったかも知れません。
>>(だから、MFC6.0のスケルトンをXPでも正しく動作するように修正する方法を探され
>>ている)ということでしょうか。
はい、何かMFC6.0で正しく動作する解決策がないかと思っていました。
判明しました。uxtheme.dllのバグのようです。
Windows XP で MFC アプリケーションを実行すると GDI オブジェクトで
メモリ リークが発生する
http://support.microsoft.com/kb/319740/ja
パッチが出ているようですが、個別対応になるみたいです。
本当ですねっ!
Kerryさん、ありがとうございます!!!
すごく助かりました!
Kerryさん、Banさん、woodさんありがとうございます!!!
m(__)m
ちょっと待った。
> マイクロソフトでは、この問題をこの資料の冒頭に記載したマイクロソフト
> 製品の問題として認識しています。この問題は、Windows XP Service Pack 1
> で修正済みです。
うちのSP2で直ってないのはなんでだ・・・?
別の問題かな?
http://support.microsoft.com/kb/319740/EN-US/
失礼、英語KBの方で確認してみたら、SP2で発生すると書いてありましたm(__)m
> When you run a Microsoft Foundation Classes (MFC) application on a
> computer that is running Microsoft Windows XP with Service Pack 2 (SP2)
> installed, you may see memory leaks for Graphics Device Interface (GDI)
> objects when you create and destroy child windows. To see the memory leaks,
> view the GDI objects of the process in Task Manager.
# 日本語版の誤植?