はじめまして、現在ビットマップを読み込んで
任意の場所にBMPを表示するプログラムを作成していますが
下記のコードを数分実行後にプログラムが Out of memory
と言うエラーを出してとフィリーズしてしまいます。
理由がわかる方、ご指導願います。
宜しくお願い致します。
開発環境 vc++6.0 MFC ダイアログベース
// 初期化で一度だけ読み込み
bmp.LoadBitmap(IDB_BMP_HOGE);
・
・
・
// 100msecに一度繰り返し実行
HOGE(CMemDC *imageDC)
{
memDC.CreateCompatibleDC(imageDC)
memDC.SelectObject(&bmp);
imageDC->BitBlt(x,y,50,50,&memDC,0,0,SRCCOPY);
memDC.DeleteDC();
}
imageDCと互換性のあるmemDCを作って、
作ったばかりのmemDCからimageDCにコピーしてるの?
本当に数分間正常に動作するプログラムですか?
間が何か省略されているのかな?
memDCとHOGEの関係は?どっちもダイアログのメンバーかな?
CMemDCとは?
imageDCのインスタンスはどこ? 100ms毎に作成されるの?
これらの情報がもう少し明らかになれば、私でも答えられるかも。
// 初期化で一度だけ読み込み
bmp.LoadBitmap(IDB_BMP_HOGE);
・
・
・
// 100msecに一度繰り返し実行
HOGE(CMemDC *imageDC)
{
CDC memDC; -> 追加
CBitmap bmp; -> 追加
memDC.CreateCompatibleDC(imageDC)
memDC.SelectObject(&bmp);
imageDC->BitBlt(x,y,50,50,&memDC,0,0,SRCCOPY);
memDC.DeleteDC();
}
説明
bmp.LoadBitmapで読み込んだ画像をmemDCに繰り返し表示させています
> 説明
> bmp.LoadBitmapで読み込んだ画像をmemDCに繰り返し表示させています
だから、そういうことをしているようなソースには見えないんですが。
BitBltの使い方が逆じゃない?
>BitBltの使い方が逆じゃない?
「CMemDC *imageDC」となっていますが、CMemDCというクラスはVC6のMFC
に含まれていなさそうなのですが。
そのあたりであべこべになっていませんか?
もう一つ、「HOGE(CMemDC *imageDC)」の中で「CBitmap bmp」を宣言して
いますが、LoadBitmapを行っているインスタンスと同じならその書き方は誤解を
招きます。
関係する変数の宣言場所や、LoadBitmap等を行っている場所の説明なども
省略しないほうがいいと思います。
SelectObjectした後戻していない点も少し気になります。
あと、「CDC memDC」はディスプレイの色数とかが変わらなければ作り直さなくて
もいいので、0.1秒に一回と比較的高頻度で呼ぶ場合はLoadBitmapと同じ場
所で作ってやっても良い筈です。
呼び出し元でimageDCを解放してないとか、
別の場所でリークしてるとか。
どちらにせよ、クラッシュするまで動かさず
デバッグ途中でアプリを終了させれば
IDEの「メモリリークディテクタ」が場所を教えてくれると予想。
みなさん誤指導ありがとうございました。
>別の場所でリークしてるとか。
そうでした。お騒がせしました。
ちなみに以下あべこべと指摘された
コードの流れです。
// グローバルに定義
CDC memDC;
CBitmap bmp;
// 初期化で読み込み
bmp.LoadBitmap(IDB_DANGER);
CPaintDC dc(this);
CMemDC imageDC(&dc);
↓
drawMarkings(&imageDC);
↓
drawMarkings(CMemDC *imageDC)
{
memDC.CreateCompatibleDC(imageDC);
memDC.SelectObject(&bmp);
imageDC->BitBlt(xloc-9,yloc-30,18,17,&memDC,0,0,SRCCOPY);
memDC.DeleteDC();
}
>>誤指導ありがとうございました。
ぐは!
ただのタイプミスならいいけど狙ってたら・・・
(´▽`*)アハハ
駄レスすみませんw