プロが教えるわが家の防犯対策術!

MFC 6.0 VC++ で、処理が重くなります。
上記の環境でダイアログベースで処理を作成しています。
画面の再描画を繰り返すと、同じ処理をしていても処理が重くなります。
OnPainメッセージを受け取ったあとに、描画処理を行っているのですが、画面に表示に必要な計算も描画時に行っています。
仮想ウィンドウに描画してBitBlt()を実行する方法も試しましたが、ちらつかなくなった代わりに余計に処理が重くなりました。
描画のやり方が問題なのか、内部の処理が問題なのか良く分からないのですが、何か良い方法が無いでしょうか?

タスクマネージャーを見るとコミットチャージが増えているようです。
このコミットチャージもどう対処してよいのか良く分からないのですが、これが関係しているでしょうか?

A 回答 (2件)

使用したスレッドやクラス、メモリの開放は行われていますか?


タスクマネージャーは「コミットチャージ」ではなく「プロセス」で、
該当アプリの「メモリ使用量」「ハンドルの数」「スレッドの数」も確認してください。

この回答への補足

ありがとうございます。

ダイアログの初期化の際にInitDialogからcallocを使用して確保したメモリはOnDestroy内で開放していますが、この部分ではない気がします。

確認してみたところ、ハンドル数とスレッド数は変化ありませんが、メモリー使用量が増えています。
再描画するたびに増えているので、描画関連の処理の中で何かが起きている気がします。

描画は描画用のクラスを作成して、内部にCDC m_dcを設けて、m_dc.Attach(*dc)の後に描画処理をおこない、終了後にm_dc.Detach()を実行しています。

BOOL CGraphics::MyCreate(CDC *dc)
{
BOOL flg = m_dc.Attach(*dc);
m_dc.SetBkMode(TRANSPARENT);
return flg;
}

HDC CGraphics::MyDetach()
{
return m_dc.Detach();
}

///////////////////////////////////////////////////////////////////////////////////
// 線を引く
///////////////////////////////////////////////////////////////////////////////////
void CGraphics::line(int x1, int y1, int x2, int y2, int width, COLORREF color)
{
CPen pen;
pen.CreatePen(PS_SOLID,width,color);
m_dc.SelectObject(&pen);
m_dc.MoveTo(x1,y1);
m_dc.LineTo(x2,y2);
pen.DeleteObject();
}

・・・というような基本構成になっています。

呼び出す側は・・・
ヘッダーの中で CGraphic m_Gr;をダイアログのメンバシップ変数として定義しています。

void CMyDialog::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト

MyViewMain(&dc);
}
// 描画のメイン
void CMyDialog::MyViewMain(CDC *dc)
{
ViewGrid(dc,View.GridLink[START],0);
ViewGrid(dc,View.GridLink[END],1);

dc->SelectClipRgn(NULL);
}
void CMyDialog::ViewGrid(CDC *dc, int grid, int sid)
{
CRgn Rgn;
m_Gr.MyCreate(dc);
Rgn.CreateRectRgn(SelScreen.left,SelScreen.top,SelScreen.right,SelScreen.bottom);
m_Gr.m_dc.SelectClipRgn(&Rgn);

//このあたりにforループなどで制御された描画命令が書かれる

Rgn.DeleteObject();
m_Gr.MyDetach();
}

・・・っといった構成になっています。

補足日時:2010/03/23 10:07
    • good
    • 0
この回答へのお礼

解決しました。

メモリーが増えている部分を追跡したところ・・・
Rgn.CreateRectRgn(SelScreen.left,SelScreen.top,SelScreen.right,SelScreen.bottom);
が2行重複して定義されている部分がありました。
これを削除したところ、現象を回避することができました。
どうやら、私のポカミスだったようです。

ありがとうございました。

お礼日時:2010/03/23 13:02

計算内容にもよりますが計算してからOnPaint行うのが一般的な考え方ではないでしょうか


時間経つごとに計算量が増えるようなロジックであれば
当然遅くなるということはありえると思います

ちょっと気になりましたが
処理が重いというのはOS全体のレスポンスが悪くなる ということでしょうか
それともアプリケーションの表示(更新・その他)が遅くなるということでしょうか?

>タスクマネージャーを見るとコミットチャージが増えているようです。
#1さん書かれてますがどこかでリークしてるような気がします
アプリケーション終了時にVC上に一杯エラー表示されませんか?

この回答への補足

ありがとうございます。

計算というより、計算結果をforループなので座標を出しながら表示していくもので、時間と共に内容が変わるものではありません。

ちゃんと測定したわけではありませんが、重くなっているのはアプリケーションのみだと思います。

特にエラーは表示されません。重くなっているのを我慢すれば使用し続けられます。

補足日時:2010/03/23 09:29
    • good
    • 0
この回答へのお礼

解決しました。

ありがとうございます。

エラーは表示されていませんでしたが、表示部でリージョンを2重に定義している部分がありました。
重複している部分を削除したら、現象が収まりました。

お礼日時:2010/03/23 13:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A