リソースの低減について

このQ&Aのポイント
  • デスクトップ上で猫を動かす方法について環境WIN98 VC++6.0 MFCにて、参考サイトを元に絵を切り替えて動かしましたが、リソースがどんどん減っていく問題が発生しました。
  • リソースメーターで確認したところ、deleteしても改善されないことがわかりました。どのような対処方法があるでしょうか?
  • これにより、リソースの低減についての解決策を探しています。
回答を見る
  • ベストアンサー

リソースの低減について

環境 WIN98 VC++6.0 MFC にて 下記サイトを参考にデスクトップ上で猫を動かしました。 http://plaza2.mbn.or.jp/~yoshio2/vcmemo4-1.html 参考サイトではデスクトップ上に絵を書いているだけですが、私は絵を2枚用意しタイマーで2枚の絵を切り替えて動かしました。 タイマーで 猫1用リージョン作成+猫1用絵のロード 猫2用リージョン作成+猫2用絵のロード を繰り返しました。 PGを起動しウィンドウズのリソースメーターで見てみると、どんどんリソースが減っていきます。 とりあえず以下のようにdeleteしてみましたが、改善されませんでした。 CRgn* m_rDone; CBitmap m_p[2]; 略 DeleteObject(*m_rDone); m_p[0].DeleteObject(); m_p[1].DeleteObject(); どう対処すれば良いでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

で、参考urlを見ました。 >PGを起動しウィンドウズのリソースメーターで見てみると、どんどんリソースが減っていきます。 ここのソースをそのままタイマーで呼び出して、画面の形状の切り替えに使うと、C++として基本的なところがまずいです。 newで作成したインスタンスのdeleteが行われていません。 >タイマーで >猫1用リージョン作成+猫1用絵のロード >猫2用リージョン作成+猫2用絵のロード >を繰り返しました。 ちなみに、こういうときは、リージョンはあらかじめ2つ作成しておき、タイマーでは作成しておいたリージョンをコピーし、それをウィンドウに設定するのが普通です。 また、ビットマップのロードも、タイマーで毎回行う必要もありません。 あらかじめロードしておいて、タイマーでは描画するだけでいいんですから。 理由は、リージョンの作成も、ビットマップのロードも時間がかかるからです。 このサンプルがOnInitDialogですべての処理を行っている理由を考えてくださいね。 ウィンドウの形状がOnInitDialog以降変化しないからこれでもかまわないんです。

VitaminBB
質問者

お礼

回答ありがとうございます。 >newで作成したインスタンスのdeleteが行われていません。 質問後に気がついてdeleteしてみましたが、現象は改善されませんでした。 >理由は、リージョンの作成も、ビットマップのロードも時 >間がかかるからです。 初めてのことでよく分からなかったので、 1.初めに作成すると画像データが多い場合はメモリを消費するんじゃないかと思いました。 2.後で作成すると処理時間がかかり動作が遅くなるのではと思いました。 それで今回はパターン2でやってみました。 >このサンプルがOnInitDialogですべての処理を行ってい >る理由を考えてくださいね。 >ウィンドウの形状がOnInitDialog以降変化しないからこ >れでもかまわないんです。 起動後にウィンドウの形を変える場合も想定して、何とか今回の場合の不具合を直したいと思いました。 #実はいろいろいじっていたら、リソース減少は直ってしまいました。 前のコードと比較して何が功を奏したのか調べてみます。

VitaminBB
質問者

補足

CDC *pDC, tempDC9;と宣言していたのを以下のように分けたら直ってしまいました。理由はわかりません。 *************************   //CDC *pDC, tempDC9;  //■コメントアウト   CDC *pDC;  //■変更   CBitmap m_p9[2];   pDC = GetDC();   CDC tempDC9;  //■変更   tempDC9.CreateCompatibleDC(NULL);   m_p9[0].LoadBitmap(IDB_BITMAP1);   m_p9[1].LoadBitmap(IDB_BITMAP2);

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>CRgn* m_rDone; ポインタのようですが、実体は? >DeleteObject(*m_rDone); MFCのクラスのインスタンスをなぜWinAPIで解放? ということで、これだけでは分かりません。

VitaminBB
質問者

お礼

回答ありがとうございます。 今回はオブジェクトの破棄が分かっていないことを痛感してます。

関連するQ&A

  • MFCでCImageListに画像追加失敗

    MFCを使ってダイアログアプリを作っています。 やっていることは、CImageListへ画像ファイルの縮小画像(128x128へリサイズ済)を追加し、 CListViewで縮小画像を表示させようとしているのですが、画像が追加されたりされなかったりします。 以下処理内容です。 全部で20個の画像を追加します。(これはフォルダ内にある画像ファイルの数に依存します) 1回の登録する処理では、CImageListが1個、画像ロード用のCImageが1個、CImageの画像を コピーして縮小画像の転送ソースとして利用するためのCBitmap(+CDC)が1個と、縮小画像を 格納するためのCBitmap(+CDC)が1個あります。 (クラスメンバー CImageList m_ListImages; CBitmap m_BmpBase, CBitmap m_BmpDrawの3つ、 CImageはローカル変数で確保) ※m_BmpBaseとm_BmpDrawには、Blt()を使う為にCDCが1つずつ付けてあります 実行手順) ・画像ファイルをCImageで読み込む ・CImageのBitBlt()でCBitmap(m_BmpBase)へ転送 ・CImageの画像をDestroy()で削除 ・m_BmpBaseの画像をStretchBlt()で縮小させて、別のCBitmap(m_BmpDraw)に格納 ・m_BmpBaseとm_BmpDrawに関連付けたCDCをDeleteDC()で削除 ・m_BmpBaseをDeleteObject()で削除 ・CImageListへAdd()でCBitmap(m_BmpDraw)を追加 ・m_BmpDrawをDeleteObject()で削除 上記動作を20回(20ファイル)行います。 これを実行させると、CImageListへ格納された画像の個数は、5個しか格納されていませんでした。 最初の5個が登録されたと言う訳では無く、1個格納毎にGetItemCount()で格納数を取得して、 テキストファイルに書き出させた所、1,1,1,1,1,2,2,3,3,3,4,4,4,4,4,5,5,5,5,5と、登録2~5個目、7個目、 9~10個目、12~15個目、17~20個目の登録が失敗しているみたいなのです。 また、CImageListへのAdd()のリターン値は-1(失敗)ではなく、0以上の値が返ってきています。 登録できた画像はCListViewに表示されています。 ここで質問ですが、この様にAdd()のリターン値は正常登録を示す番号を返してくるのにも関わらず、 登録ができていない(格納された画像が増えない)原因は何があるのでしょうか?

  • システムリソースorメモリ不足

    OSはWindouws98で、メモリは64Mです。システムリソースが少なく起動時38%だったので、デフラグしたりデスクトップを減らしたり、常駐アイコンを閉じたり、メモリークリーナーを使ったのですが、起動時48%くらいです。 やはり64Mだとメモリを増やさないと無理なのか? フリーズも多いです。メモリとシステムリソースは別だということは何となくわかっているのですが、よく理解していません。フリーズ状態、インターネットの読み込みが遅いなど上記のことと関係あるのでしょうか? またあるサイトのページにいくと毎回『IEXPLORE のページ違反です。』となり強制終了してしまいます。またそのサイトからのメールをアウトルックで受信しようとするとやはり『MSIMN のページ違反です。』とメッセージがでて、同様に強制終了してしまいます。 これはこちらのPCの問題かもしくは相手サイトの問題なのでしょうか・・ちなみに他のサイトでは今までこのようなことはありません。

  • スロットマシンの判定方法(VB6での作成)

    お世話になります。 仕事で急にVB6を使ってスロットマシンを作成することに、 なったのですが、はじめて使うVBに戸惑っております。 今のところ、イメージボックスにビットマップデータを入れ、Form loadにデータとしておいて、各リール用にタイマーを用意し、何回か回転すると、タイマーのインターバールを0にして、止めるというところまでは出来たのですが リールデータは回転絵柄の為、停止時に表示する絵柄以外にも回転中の絵柄がはさんであります。 これを回転させ、ランダムに停止絵柄で止めて絵柄が揃ったら配当するといった判定方法が思いつきません。 ぜひご指導のほど、お願いします。 また参考サイトなども教えていただけるとありがたいです。

  • if文の判定について

    <環境> WIN98 VC++6.0 MFC  ダイアログベースにて 以下コードにて、タイマーによる変数nの変化に伴い絵1と絵2が切り替わっています。 int n; void CxxxDlg::OnPaint() { 略 m_p9[0].LoadBitmap(IDB_BITMAP1); m_p9[1].LoadBitmap(IDB_BITMAP2); tempDC9.SelectObject(&m_p9[n]); 略 } void CxxxDlg::OnTimer(UINT nIDEvent) { n=n+1; if(n>=2){ n=0; } Invalidate();   CDialog::OnTimer(nIDEvent); } ところがコードの一部を以下のように変更すると、 if文で正しく判定できなくなります。 どうしてなのでしょうか? if (n=0){ m_p9[0].LoadBitmap(IDB_BITMAP1); } m_p9[1].LoadBitmap(IDB_BITMAP2);

  • MFCでウィンドウ枠をアニメーションさせたい

    こんにちは、VC++初心者です。 今MFCでデスクトップマスコットを作りたいと思っています。 MFCのSDIアプリでとりあえず作成している最中で、 BMP画像の表示はC***ViewクラスのOnDraw関数で表示させています。 問題はウィンドウ枠です。 スタイル指定をWS_POPUPにして、クライアント領域にのみ表示させていますが、 リージョンを使って、BMP画像を切り取った形のウィンドウにするのにてこずっています。 ちうか、そもそもOnDraw関数内でBMP表示とともに行っている、 SetWindowRgn関数がうまく動いてくれていない状態です(泣)。 ソースの一部をのせておきますで、どうかご判断ください。 宜しくお願いします。 CTestView::CTestView() { //コンストラクタでビットマップの読み込みとリージョンの設定 gazou.LoadBitmap( IDB_GAZOU); //CBitmapのメンバ変数 m_rgn[0].CreateEllipticRgn(0, 0, 48,48); //CRgnのメンバ変数1 m_rgn[1].CreateRectRgn(0, 0, 48,48); //CRgnのメンバ変数1 } void CTestView::OnDraw(CDC* pDC) { //画像表示及びリージョンの切り替え 中略... static int anim = 0; CDC dc; dc.CreateCompatibleDC( pDC); dc.SelectObject( gazou); pDC->BitBlt(0,0,48,48,&dc,0,0,SRCAND); //48*48ドットのBMP HRGN hrgn =(HRGN)m_rgn[anim].Detach(); SetWindowRgn( hrgn, true); dc.DeleteDC(); anim ^= 1; 中略... }

  • VBでデスクトップアクセサリを作りたい

    VB6を始めたばかりの超初心者です。すごいくだらない質問かもしれませんが、教えて下さい(^^;) デスクトップアクセサリを作りたいのですが、VBで作れますか? 具体的には、例えばりんごの絵を表示したい時に、実行するとりんごの絵の部分だけ表示されて、余白の部分は表示されない(余白の部分はデスクトップの壁紙が見える)というような物を作りたい時にどうすれば良いか教えて下さい!ほんと初心者の質問ですみませんm(__;)mお願いします! それから、VBでデスクトップアクセサリを作る時に参考にするのに、何か良いHPがあれば教えて下さい。お願いします。

  • [WinAPI]フォルダ上に表示されるアイコン

    プログラム内でアイコンを2つ使っているのですが 1つはWNDCLASSEX構造体のhIconメンバに渡して 2つめはDrawIconExで描画用に使っています。 しかし、1つめのアイコンはタスクバー上のアイコンとしては表示されるのですが (ウィンドウ自体はリージョンウィンドウで作成したのでタイトルバーはありません。また、タスクトレイと勘違いしてるわけでもないです。) 作成した.exeファイルには2つめのアイコンが表示されてしまいます。 リソースから2つめのアイコンを消すと1つめのアイコンが.exeのアイコンとして表示されるようですが、 2つめのアイコンを使わないわけにはいきません。 リソースファイルには ICON1 ICON "Icon1.ico" ICON2 ICON "Icon2.ico" とだけ指定してあります。 アイコンのロードにはLoadImageで第2引数にはTEXT("ICON1")のように文字列で指定しています。 ウィンドウクラス構造体に指定したアイコンがそのまま、.exeファイルのアイコンとして表示されるのだと認識しているのですが なぜ、描画用にしようしたアイコンが表示されてしまうのでしょう? 解決するための方法や参考になるサイトなどあればご教示ください。

  • ダイアログの表示と同時に、ピクチャーボックスを塗る方法

    あるサイトの過去ログで以下を見つけました。 エラーは出ませんが、何も起こりません。 このコードは何をしようとしているのでしょうか? ************************* ダイアログ上にピクチャーボックスを配置して、ダイアログの表示と同時に、ピクチャーボックスを塗る方法。 まず、ピクチャコントロールをClassWizardのメンバ変数タブによりm_pictureとして実態を作成します。 その後、 class CPictureDlg { private: CBitmap m_bitmap; // ... }; BOOL CPictureDlg::OnInitDialog() { CDialog::OnInitDialog(); // ... CDC desktopDC; desktopDC.Attach ( ::GetDC ( NULL ) ); CDC memDC; memDC.CreateCompatibleDC ( &desktopDC ); m_bitmap.CreateCompatibleBitmap ( &desktopDC, 100, 100 ); CBitmap *pOldBitmap = memDC.SelectObject ( &m_bitmap ); CRect rcPicture ( 0, 0, 100, 100 ); CBrush brush; brush.CreateStockObject ( WHITE_BRUSH ); memDC.FillRect ( &rcPicture, &brush ); memDC.SelectObject ( pOldBitmap ); m_picture.SetBitmap ( ( HBITMAP ) m_bitmap.GetSafeHandle () ); ReleaseDC ( &desktopDC ); memDC.DeleteDC (); }

  • フォルダの表示が遅い

     過去ログを参照したのですが、見当たらなかったので質問させていただきます。  ワードやエクセルを使うときに、”ファイルを開く”からファイルを開こうとすると、フォルダの表示にすごく時間がかかります(30秒ほど)。ドライブやフォルダを選ぶたびに時間がかかるのです。  しかし、マイコンピュータやエクスプローラからフォルダを開くとスムーズに開くのです。  改善する方法をご指導ください。 環境 PC:日立FLORA350 OS:WindowsME アップデートは定期的にしています。 office:OfficeXP CPU:Pentium3 866 メモリ:128M HDD:20G リソース:76% スキャンディスク・デフラグ・一時ファイルの削除・デスクトップには何も置かない等このサイトを参考に、できるかぎりリソースを増やす努力はしています。 よろしくお願いします。

  • ショートメールの作成方法がわからない

    現在、古い機種なのですが docomoのP501iを使っています。 iモ-ドを使うメールはできるのですが、 説明書を捨ててしまったため、ショートメールの作成ができなくて困っています。 メニューの中にも、ショート-絵mるを作成する方法のヘルプがありません。 どなたか、こまかくご指導願います。

専門家に質問してみよう