MFCスケルトンにてリソース不足

[戻る]
トンプソン 2005/04/19(火) 11:29:38
いつもお世話になっています。
現在、リソース不足発生の解決策を探しております。

例えば・・・
↓
XPVC++6.0にて
↓
新規プロジェクトでMFCアプリケーションの
スケルトンプロジェクト作成
↓
実行
↓
メモリチェックソフト等でリソースを随時チェック
↓
子ウィンドウを開く
↓
リージョンの値が増加(メモリチェックソフトにて)
↓
子ウィンドウを閉じる
↓
リージョンの値はそのまま
↓
このまま、400回程繰り返すと
リージョン、GDIリソース、Userリソースが大幅に増加。
リソース不足でアプリケーションが死んでしまいます・・・。

このようなテストをmicro softのエクセル等でチェックしてみたところ
子ウィンドウクローズ時にリージョンが減少し、リソース不足対応はされているようで
す。

対応策としてはOS側として
マイコンピュータ→プロパティ→詳細設定→パフォーマンス→パフォーマンスを優先す
る
をチェックすると対応できることも分かりましたが。。。
(子ウィンドウオープン時、リージョンの増加がしない)
VC++内での対応策はないものでしょうか?
ご助言よろしくお願いします。

トンプソン 2005/04/21(木) 15:13:57
すみません、リージョンの増加によるリソース不足ではなく。
GDIリソースが9999付近まで増加した時のシステム不足でした。
でも、原因まではいまだ掴めておりません。
よろしくお願いします。

トンプソン 2005/04/21(木) 18:19:12
度々すみません、訂正です。
リージョン追加を確認しました。

MFCアプリケーション(スケルトン)で
子ウィンドウ新規作成→クローズ
を1653回繰り返すとリソース不足によるエラー発生です。

何かご助言よろしくお願いしますm(__)m

wood 2005/04/21(木) 18:34:20
意味がちゃんと伝わってないから、誰もレス付けないんじゃないの?
俺の環境も
XP PRO
Visual Studio 6(EP)(SP6) 
だけど
>新規プロジェクトでMFCアプリケーションの
>スケルトンプロジェクト作成
こんな項目無いし
MFC APPWIZARD(EXE,DLL) だったとしても
実際 IDE で
>子ウィンドウを開く
>↓
>リージョンの値が増加(メモリチェックソフトにて)
>↓
>子ウィンドウを閉じる
の単純繰り返しを1653回もやる現実的作業じゃないし

もう少し、理解可能なように書いてくれませんか?

wood 2005/04/21(木) 18:55:34
↑書き込んでから思ったんですけど
実はIDEがメモリリークして困っているのでは無く
MFC MDI グラフィック描画アプリがメモリリークして困っている
って事でしょうか?
ならば、ソースコード 載せるとかしないと レス 付かないかも



>(子ウィンドウオープン時、リージョンの増加がしない)
これどうやって見つけたのかも説明欲しいかも

トンプソン 2005/04/21(木) 19:11:43
お返事ありがとうございます。

>>MFC MDI グラフィック描画アプリがメモリリークして困っている
>>って事でしょうか?

すみません・・・。
VC++で作成したプロジェクトは
MFC AppWizard(exe)
です。
プロジェクト内でソース作成せず空のスケルトン内でテストしました。
おそらくGDIリソースがメモリリークしています。

テスト時のリージョン、GDIリソースの参照には
MemSpy2.0を使用。

>>単純繰り返しを1653回もやる現実的作業じゃないし

現実的な作業ではありませんが、プログラマーが直せる範囲のエラーでしたら、
直したいと思い、助言いただければと思いました。

Kerry 2005/04/21(木) 19:11:52
原因はわかりませんが、確かに発生しますね。(XP Pro SP2、VC++6.0)

MFC AppWizard (exe)で、MDIアプリケーションを作成し、
生成されたスケルトンをビルドして実行します。

タスクマネージャの[プロセス]ページで確認してみると、
確かにMDI子ウィンドウをオープンするごとに
GDIオブジェクトの数が6つ程度増加し、しかも
子ウィンドウを閉じても減りません。

なお、XPのテーマをWindows クラシックにすると発生
しなくなりました。

また、SDKで単純なMDIアプリケーションを作成し、
実行した場合も再現しませんでした。

MFC内部で行われている何らかの処理(ウィンドウ背景ブラシ等)
が関係しているような気がします。

トンプソン [E-Mail] 2005/04/22(金) 09:43:02
Kerryさん、お返事ありがとうございます。
自分もGDIオブジェクトの数が6つ程度増加します。

>>MFC内部で行われている何らかの処理(ウィンドウ背景ブラシ等)
>>が関係しているような気がします。

そうなんですか・・・。
同じ動作をExcel等で行ってみたところ子ウィンドウクローズ時に
GDIオブジェクトの数が減るんですよ・・・。

Ban 2005/04/22(金) 11:14:51
# 回答ではなくてすみません。

> このようなテストを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だと問題ないとかありそうな....

トンプソン 2005/04/22(金) 11:30:28
Banさん、お返事ありがとうございます。
とても勉強になりました。

>>Excel のバージョンが分りませんが、Excel ってもともと MFC ベースじゃないです
>>よね。
>>(それとも最近のものはMFC6.0ベースで書き換えられているんでしょうか.....)
>>単に比較対象としての非MFCアプリの例ということでしょうか。

そうだったんですか、それですと確認方法が甘かったと思います。

>>MFC6.0 の開発当時(発売が97年?)に想定もされていなかった特殊な環境下(XPのテ
>>ーマ)で、
>>MFC6.0 がそれ以前の環境(非XP)用に用意したMDI用のスケルトンをそのまま使うと
>>問題がでる。

そう考えますと少し我侭な質問だったかも知れません。

>>(だから、MFC6.0のスケルトンをXPでも正しく動作するように修正する方法を探され
>>ている)ということでしょうか。

はい、何かMFC6.0で正しく動作する解決策がないかと思っていました。

Kerry 2005/04/22(金) 11:56:29
判明しました。uxtheme.dllのバグのようです。

Windows XP で MFC アプリケーションを実行すると GDI オブジェクトで
メモリ リークが発生する
http://support.microsoft.com/kb/319740/ja

パッチが出ているようですが、個別対応になるみたいです。

トンプソン [E-Mail] 2005/04/22(金) 12:03:28
本当ですねっ!
Kerryさん、ありがとうございます!!!
すごく助かりました!
Kerryさん、Banさん、woodさんありがとうございます!!!

トンプソン [E-Mail] 2005/04/22(金) 12:44:44
[[解決]]
m(__)m

Kerry 2005/04/22(金) 12:48:17
ちょっと待った。

> マイクロソフトでは、この問題をこの資料の冒頭に記載したマイクロソフト
> 製品の問題として認識しています。この問題は、Windows XP Service Pack 1 
> で修正済みです。

うちのSP2で直ってないのはなんでだ・・・?
別の問題かな?

Kerry 2005/04/22(金) 12:54:18
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.

# 日本語版の誤植?

Ban 2005/04/22(金) 12:55:46
> パッチが出ているようですが、個別対応になるみたいです。

そうみたいですね。

提示先だと、
<引用>
マイクロソフトでは、この問題をこの資料の冒頭に記載したマイクロソフト製品の問題として認識し
ています。この問題は、Windows XP Service Pack 1 で修正済みです。
</引用>
ってなってますが、以下の環境でも現象が再現しましたし。
Windows XP pro (SP2) にて VC++.NET2003 の MDI スケルトン(MFC7.0)

Kerry 2005/04/22(金) 12:58:57
もしかすると、SP1で直したバグがSP2で再発したのかも
しれませんね。
(SP1の環境が無いので確認できませんが)

Ban 2005/04/22(金) 13:01:45
# おぉっと。更新したら新レスが。


> うちのSP2で直ってないのはなんでだ・・・?

私のところもでした。


> 失礼、英語KBの方で確認してみたら、SP2で発生すると書いてありましたm(__)m

....やっぱり日本語版は.....。

トンプソン 2005/04/22(金) 13:39:05
本当ですね。
日本版と英語版で3年も更新期間が違うんですか・・・。

Kerry 2005/04/22(金) 15:49:31
XP SP1の環境が見つかったので確認しました。

発生しませんでした。

やはり、SP1で修正されたバグがSP2で再発している模様です。

#SP2は他にも問題ありそうですねー

古いスレッドには追加発言できません。